详解C++ thread用法总结

详解C++ thread用法总结

什么是C++ thread?

C++ thread是一个多线程库,用于在C++中实现多线程编程。多线程是指在同一时间内执行多个线程,从而实现并发执行的目的。C++ thread为程序员提供了创建、启动、等待、终止线程以及互斥锁、条件变量等并发编程工具。

C++ thread用法总结

创建和启动线程

在C++中创建和启动线程可以使用std::thread,使用方法如下:

#include <iostream>
#include <thread>

void threadFunction() {
    std::cout << "This is a new thread." << std::endl;
}

int main() {
    std::thread t(threadFunction);
    t.join();
    return 0;
}

这段代码创建了一个名为t的线程,启动了threadFunction()函数,并且使用join()函数等待线程结束。执行结果如下:

This is a new thread.

等待线程结束

std::thread提供了join()函数,用于等待线程结束。可以使用下面两种方式实现等待多个线程结束:

方式一:

std::thread t1(threadFunction1);
std::thread t2(threadFunction2);
t1.join();
t2.join();

方式二:

std::vector<std::thread> threads;
threads.push_back(std::thread(threadFunction1));
threads.push_back(std::thread(threadFunction2));
for (auto& th : threads) {
    th.join();
}

传递参数到线程函数

可以通过lambda函数传递参数到线程函数:

#include <iostream>
#include <thread>

void threadFunction(int n) {
    std::cout << "The parameter is " << n << std::endl;
}

int main() {
    int n = 10;
    std::thread t([](int n) {
        threadFunction(n);
    }, n);
    t.join();
    return 0;
}

执行结果如下:

The parameter is 10

处理线程函数的返回值

可以使用std::futurestd::async()来实现处理线程函数的返回值。

#include <iostream>
#include <thread>
#include <future>

int threadFunction(int n) {
    return n * n;
}

int main() {
    int n = 10;
    std::future<int> result = std::async(threadFunction, n);
    int res = result.get();
    std::cout << "Result is " << res << std::endl;
    return 0;
}

执行结果如下:

Result is 100

示例

示例一:计算1到10000的和

#include <iostream>
#include <thread>
#include <vector>
#include <numeric>

void sum(std::vector<int>::iterator start, std::vector<int>::iterator end, int& result) {
    result = std::accumulate(start, end, 0);
}

int main() {
    std::vector<int> data(10000);
    std::iota(std::begin(data), std::end(data), 1);

    int res1, res2, res3, res4;
    std::thread t1(sum, std::begin(data), std::begin(data) + 2500, std::ref(res1));
    std::thread t2(sum, std::begin(data) + 2500, std::begin(data) + 5000, std::ref(res2));
    std::thread t3(sum, std::begin(data) + 5000, std::begin(data) + 7500, std::ref(res3));
    std::thread t4(sum, std::begin(data) + 7500, std::end(data), std::ref(res4));

    t1.join();
    t2.join();
    t3.join();
    t4.join();

    int result = res1 + res2 + res3 + res4;
    std::cout << "The sum of 1 to 10000 is " << result << std::endl;
    return 0;
}

执行结果如下:

The sum of 1 to 10000 is 50005000

示例二:生产者-消费者模型

#include <iostream>
#include <queue>
#include <mutex>
#include <thread>
#include <chrono>

std::queue<int> myQueue;
std::mutex myMutex;
std::condition_variable myCond;

void producer() {
    for (int i = 0; i < 10; i++) {
        std::lock_guard<std::mutex> myLockGuard(myMutex);
        myQueue.push(i);
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
        myCond.notify_one();
    }
}

void consumer() {
    for (int i = 0; i < 10; i++) {
        std::unique_lock<std::mutex> myUniqueLock(myMutex);
        myCond.wait(myUniqueLock, []{return !myQueue.empty();});
        std::cout << "Consume " << myQueue.front() << std::endl;
        myQueue.pop();
    }
}

int main() {
    std::thread t1(producer);
    std::thread t2(consumer);

    t1.join();
    t2.join();

    return 0;
}

执行结果如下:

Consume 0
Consume 1
Consume 2
Consume 3
Consume 4
Consume 5
Consume 6
Consume 7
Consume 8
Consume 9

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C++ thread用法总结 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 利用js实现Ajax并发请求限制请求数量的示例代码

    下面是详细的攻略: 概述 在一些需要频繁向服务器发送请求的场景下,如果没有限制同时发送的请求数量,可能会导致请求堆积,甚至因为资源不足而出现网页崩溃等问题。为了避免这种情况的发生,我们可以利用 JavaScript 实现 Ajax 并发请求限制请求数量的功能。 实现步骤 创建一个请求数量的计数器,初始化为 0; 定义一个请求队列,用来存储待发送的 Ajax …

    多线程 2023年5月17日
    00
  • MySQL学习之事务与并发控制

    MySQL学习之事务与并发控制 什么是事务 数据库事务(Transaction)是指作为单个逻辑工作单元执行的一组数据库操作,这组操作要么全部执行,要么全部不执行,被视为一个不可分割的工作单元。 通常,一个事务包含了一组对数据库的读/写操作。在计算机领域,事务通常被用于保证数据的完整性,例如在转账时涉及到的两个操作“扣款”和“存款”,需要保证这两个操作要么全…

    多线程 2023年5月16日
    00
  • 多线程如何解决for循环效率的问题

    作为一种并发编程方式,多线程可以有效提高程序的执行效率,并解决“for循环效率低”的问题。下面将详细讲解多线程如何解决for循环效率问题的攻略。 首先,明确for循环的效率低问题。在for循环中,由于代码是顺序执行的,每次执行完一个循环体才会进入下一个循环体,因此在循环次数较大的情况下,会造成程序执行速度慢的问题。 使用多线程可以解决for循环效率低的问题。…

    多线程 2023年5月17日
    00
  • Python 多线程Threading初学教程

    Python 多线程Threading初学教程 简介 在一些需要同时执行多个任务的场景下,使用Python多线程Threading可以有效提高程序的运行效率。本教程将为初学者详细讲解Python多线程的使用方法、常用属性和方法、以及附带两条示例说明。 创建线程 Python多线程的模块是Thread。可以使用该模块中的Thread类来创建线程。Thread中…

    多线程 2023年5月17日
    00
  • Java 多线程的同步代码块详解

    Java 多线程的同步代码块详解 在Java中,多线程操作的时候,经常会出现多个线程共享同一个资源的情况。当多个线程同时访问共享资源时,会导致数据不一致的问题,这就需要用到同步代码块来解决。 什么是同步代码块? 同步代码块是Java中实现线程安全的一种机制,用来解决多个线程同时访问共享资源的并发问题。同步代码块是指用 synchronized 关键字修饰的一…

    多线程 2023年5月16日
    00
  • SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了)推荐

    实现SpringBoot中并发定时任务和动态定时任务,可以使用Spring框架提供的@Scheduled注解和Quartz定时任务框架。 并发定时任务的实现 (1) 引入依赖 在pom.xml文件中添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId&gt…

    多线程 2023年5月17日
    00
  • Python中的并发编程实例

    关于Python中的并发编程实例,可以分为如下步骤进行: 步骤一:什么是并发编程? 并发编程简单来说就是在同一时间内处理多个任务,让程序更加高效、快速的运行。Python中有多种并发编程解决方案,例如线程、协程、多进程等。 步骤二:Python中的常用并发编程模块 Python语言自带的标准库中已经提供了一些常见的并发编程模块,例如threading、mul…

    多线程 2023年5月16日
    00
  • mysql并发控制原理知识点

    MySQL并发控制原理知识点主要涉及事务、锁和隔离级别三个方面。 事务 事务是指一系列操作被视为一个单独的逻辑单元,在满足ACID(原子性、一致性、隔离性和持久性)四个特性的同时,要么全部执行成功,要么全部不执行。MySQL默认支持事务,可以通过begin、commit和rollback等语句进行控制。 锁 在MySQL中,锁分为共享锁和排他锁,共享锁是用于…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部