详解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日

相关文章

  • 基于Golang 高并发问题的解决方案

    针对您提出的问题,我先简单介绍一下Golang高并发的特点。 Golang作为一门并发编程语言,在处理高并发场景下表现突出。它凭借其内置的并发处理机制,如goroutine、channel等,可以轻松地实现高并发的处理。但是在具体的实践中,如果我们没有考虑清楚高并发场景下的各类问题,很容易就会出现锅。下面我就具体介绍下基于Golang的高并发问题解决方案的攻…

    多线程 2023年5月17日
    00
  • Java多线程之ThreadLocal原理总结

    我们来详细讲解一下“Java多线程之ThreadLocal原理总结”的完整攻略。 1. 什么是ThreadLocal ThreadLocal 是 Java 提供的一种本地线程变量,可以为每个线程存储一份独立的变量副本,各自互不影响。这样可以避免多个线程之间对同一个变量进行竞争锁,增加程序的运行效率。 2. ThreadLocal 实现原理 ThreadLoc…

    多线程 2023年5月17日
    00
  • Java线程池并发执行多个任务方式

    当需求场景为处理大量并发任务时,我们通常使用线程池来优化性能。Java线程池可以控制并发线程数量,避免资源超额占用以及线程切换开销过大的问题。常见的线程池类有ThreadPoolExecutor和Executors等。在使用线程池时,我们可以通过不同的线程池参数及处理方式控制任务执行效率。 一、Java线程池的创建 //创建线程池 ExecutorServi…

    多线程 2023年5月16日
    00
  • 浅谈Java 并发的底层实现

    浅谈Java 并发的底层实现 前言 Java 的并发处理一直是大家关注的焦点。在Java的并发处理中,涉及到的概念非常多,如线程、锁、CAS等。事实上,这些概念并不是“简单概念”,而是与Java虚拟机和CPU等底层机制紧密相关的。 本文将从底层实现的角度对Java并发进行讲解,重点介绍线程的创建、锁的实现以及原子性的保证,增加大家对Java并发底层实现的认识…

    多线程 2023年5月16日
    00
  • Jmeter多台机器并发请求实现压力性能测试

    JMeter多台机器并发请求实现压力性能测试主要分为以下几个步骤: 1. 准备工作 确定测试目标:需要测试的页面或接口。 编写测试脚本:使用JMeter录制或手动编写HTTP请求脚本。 安装JMeter:在每台测试机器上安装JMeter。 配置JMeter:配置JMeter的相关设置,例如线程组、HTTP Cookie管理器等。 配置网络:将不同测试机器彼此…

    多线程 2023年5月16日
    00
  • 带你快速搞定java并发库

    带你快速搞定Java并发库 为什么要学习Java并发库 多线程是面向对象编程中非常重要的一个概念,能够很好地提高程序运行效率,特别是在大型应用中。在Java中,提供了Java并发库来实现多线程编程,同时能够避免线程安全问题。学习了Java并发库,可以更好地编写高质量的多线程程序。 学习Java并发库的基本知识 1. 线程的创建 Java并发库中的线程创建使用…

    多线程 2023年5月16日
    00
  • Redis瞬时高并发秒杀方案总结

    Redis瞬时高并发秒杀方案总结 背景 在高并发场景下,秒杀活动通常是让系统压力最大的操作之一。传统的数据库方式往往无法应对高并发,导致系统崩溃。而使用Redis可以有效地解决这个问题。 Redis的优势 Redis是一个基于内存的高性能缓存数据库,对于高并发的应用场景非常适用。Redis的优势主要有以下几点: 高性能:Redis以内存为存储介质,比传统的基…

    多线程 2023年5月16日
    00
  • Kotlin server多线程编程详细讲解

    Kotlin server多线程编程详细讲解 在Kotlin中,使用多线程编程非常方便。下面将详细介绍多线程编程的使用方法和一些示例。 线程池的概念和使用 线程池是一种用于控制线程数量和复用线程的机制。使用线程池可以减少线程创建和销毁的开销,提高程序执行效率。在Kotlin中,我们可以使用java.util.concurrent中的线程池相关类来实现线程池的…

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