C++11线程、互斥量以及条件变量示例详解

yizhihongxing

我来讲解一下“C++11线程、互斥量以及条件变量示例详解”这个话题的完整攻略。

什么是C++11线程、互斥量以及条件变量?

C++11是C++语言的标准之一,其中包含了多线程编程的支持。C++11中提供了std::thread类来创建和管理线程,同时还定义了std::mutex和std::condition_variable来支持线程之间的同步和互斥。

当多个线程同时访问同一资源时,会出现资源竞争的情况。为了避免资源竞争,需要使用互斥量来控制对资源的访问。条件变量则用于协调线程之间的时间顺序和防止不必要的等待。

示例1:使用互斥量实现线程之间的同步和互斥

下面是示例代码:

#include <iostream>
#include <thread>
#include <mutex>

using namespace std;

mutex mtx; // 全局互斥量

void print(char ch){
    mtx.lock();
    for (int i = 0; i < 5; ++i){
        cout << ch;
        this_thread::sleep_for(chrono::milliseconds(100));
    }
    cout << endl;
    mtx.unlock();
}

int main(){
    cout << "Start..." << endl;

    thread t1(print, 'A');
    thread t2(print, 'B');

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

    cout << "End..." << endl;

    return 0;
}

上面的程序创建了两个线程t1和t2,其中t1和t2都调用了print函数来输出指定的字符。

整个程序的执行过程如下:

  1. 程序开始执行,输出“Start...”
  2. t1和t2线程分别开始执行,t1输出5个‘A’,t2输出5个‘B’
  3. 程序等待t1和t2线程执行完成
  4. 程序输出“End...”

注意,为了同步访问共享资源cout,我们使用了mtx互斥量来控制对共享资源的访问。

示例2:使用条件变量实现线程之间的协作和防止不必要的等待

下面是示例代码:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

using namespace std;

mutex mtx; // 全局互斥量
condition_variable cv; // 全局条件变量
bool ready = false; // 全局标记位

void print(char ch){
    unique_lock<mutex> lock(mtx); // 所有操作前需要先获取锁
    while (!ready){ // 等待条件成立
        cv.wait(lock);
    }
    for (int i = 0; i < 5; ++i){
        cout << ch;
        this_thread::sleep_for(chrono::milliseconds(100));
    }
    cout << endl;
    ready = false;
    cv.notify_one(); // 通知一个正在等待的线程
}

int main(){
    cout << "Start..." << endl;

    thread t1(print, 'A');
    thread t2(print, 'B');

    this_thread::sleep_for(chrono::milliseconds(500));
    ready = true; // 设置条件成立

    cv.notify_one(); // 通知一个正在等待的线程

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

    cout << "End..." << endl;

    return 0;
}

上面的程序创建了两个线程t1和t2,其中t1和t2都调用了print函数来输出指定的字符。

整个程序的执行过程如下:

  1. 程序开始执行,输出“Start...”
  2. 两个线程t1和t2同时等待条件ready成立
  3. 主线程等待500ms后设置标记位ready=true,同时通知一个正在等待的线程
  4. t1和t2线程中只有一个线程(根据系统调度情况)被唤醒,输出5个指定字符
  5. 重复第2-4步,直到t1和t2线程全部执行完成
  6. 程序输出“End...”

注意,在示例2中,我们使用了condition_variable来协调线程之间的时间顺序和防止不必要的等待。在等待条件ready时,线程会进入等待状态,并释放已经获取的锁,直到条件ready成立时再重新获取锁并继续执行。在设置ready=true时,我们需要通知一个正在等待的线程,确保等待的线程可以继续执行。

以上就是关于“C++11线程、互斥量以及条件变量”的完整攻略,希望可以帮助到您。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++11线程、互斥量以及条件变量示例详解 - Python技术站

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

相关文章

  • java并发编程之cas详解

    Java并发编程之CAS详解 一、CAS的概述 CAS(Compare And Swap),中文名是比较并交换,是一种多线程并发机制,用于实现无锁算法。它包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新成新值。否则,处理器不做任何操作。在任何情况下,都会返回该位置原有的值。CAS是…

    多线程 2023年5月17日
    00
  • java 多线程的三种构建方法

    Java 多线程的三种构建方法 在 Java 中,有三种常用的多线程构建方法:继承 Thread 类、实现 Runnable 接口和实现 Callable 接口。个人建议在实际开发中尽量使用实现 Runnable 接口的方法。 继承 Thread 类 继承 Thread 类是 Java 最原始的多线程实现方法。具体实现过程是创建一个类继承 Thread 类,…

    多线程 2023年5月17日
    00
  • Java中同步与并发用法分析

    Java中同步与并发用法分析 同步 在Java中,同步是指多个线程之间访问共享资源的时候,保证线程安全的机制。Java提供了两种机制来实现同步:synchronized关键字和Lock接口。 synchronized关键字 synchronized关键字可以用于修饰方法或代码块。被修饰的方法或代码块在同一时间只能被一个线程执行,其他线程需要等待。 示例代码:…

    多线程 2023年5月16日
    00
  • Nodejs爬虫进阶教程之异步并发控制

    “Nodejs爬虫进阶教程之异步并发控制”是一个涉及到JavaScript异步编程和并发控制的进阶主题,下面详细讲解完整攻略: 什么是异步编程? 在Javascript中,异步编程是通过回调函数(callback)的方式来实现的。在异步操作完成后,将会调用回调函数来传递返回值或者错误信息。异步编程的好处是在处理耗时操作时不会阻塞主线程,从而提高了程序的响应速…

    多线程 2023年5月17日
    00
  • redis-benchmark并发压力测试的问题解析

    那我来详细讲解一下“redis-benchmark并发压力测试的问题解析”的完整攻略。 什么是redis-benchmark并发压力测试? redis-benchmark是一个Redis自带的基准测试工具,可以通过运行redis-benchmark命令进行并发请求测试。该命令提供了多种测试模式、并发连接数、请求大小、数据类型和其他选项,可用于测试Redis服…

    多线程 2023年5月16日
    00
  • Java并发编程之常用的多线程实现方式分析

    Java并发编程之常用的多线程实现方式分析 介绍 Java作为一门历史悠久的编程语言,其并发编程支持非常完善。在实际的开发过程中,多线程技术经常用于提高程序的性能和处理能力。本文将对Java中多线程常用的几种实现方式进行分析,并给出两个示例介绍。 多线程实现方式 继承Thread类 继承Thread类是Java中非常基本的多线程实现方式之一。具体步骤如下: …

    多线程 2023年5月16日
    00
  • java并发编程_线程池的使用方法(详解)

    Java并发编程:线程池的使用方法(详解) 什么是线程池? 线程池是一种线程管理的机制,可以避免频繁创建和销毁线程所带来的开销。通过提前创建一定数量的线程并将它们组织成池,其他需要执行任务的线程可以从池中获取空闲的线程来执行任务。 线程池的优势 使用线程池的优势主要在以下几方面:1. 重用线程,减少线程创建和销毁所带来的开销。2. 更好的管理线程,统一分配、…

    多线程 2023年5月16日
    00
  • Java并发计数器的深入理解

    Java并发计数器的深入理解 什么是Java并发计数器 Java并发计数器是一项重要的多线程技术,它可以在多线程环境下高效地实现数据的计数。 Java并发计数器的本质是使用CAS原子操作实现的,CAS的全称是Compare and Swap,即“比较并交换”,CAS提供了一种无锁化的解决方案,让多线程同时更新同一个数据变得更加高效。 实现原理 在并发计数器的…

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