c++11线程之条件变量condition_variable(二)

题目:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。

采用C++11实现:

[cpp] view plaincopyprint?

  1. #include<iostream>
  2. #include<thread>
  3. #include<mutex>
  4. #include<condition_variable>
  5. using namespace std;
  6. mutex m;
  7. condition_variable cond;
  8. int LOOP=10;
  9. int flag=0;
  10. void fun(int id){
  11. for(int i=0;i<LOOP;i++){
  12. unique_lock<mutex> lk(m);
  13. while(id!=flag)//一定要用循环判断,若是if多个阻塞线程唤醒后同时处于临界区
  14. cond.wait(lk);
  15. cout<<(u_char)(‘A‘+id)<<" ";
  16. flag=(flag+1)%3;
  17. cond.notify_all();
  18. }
  19. }
  20. int main(){
  21. thread B(fun,1);
  22. thread C(fun,2);
  23. fun(0);
  24. cout<<endl;
  25. B.join();
  26. C.join();
  27. return 0;
  28. }

总结:这个题与上一个稍微复杂,因为它多了一个线程,多了一个线程问题就来了,假设有线程ABC,我们要让A先执行一部分代码,BCwait,这好办,通过条件变量让BC等待,A执行完后BC都接到信号,此时BC同时执行?不处理的话确实是同时执行,但是上题是确保B先执行,那就要注意上面代码的红色区域,通过while判断:当A执行完后,我们想执行B,那需要A执行后改变一下标志量flag,这里是加1,此时BC同时收到信号继续执行,因为while的存在,又要进行判断,这次判断的结果是B跳出while,而C继续循环停在wait处,同理,B执行后,同样设置flag,然后c跳出循环,这样就达到控制3个线程顺序的效果了。而根据需求不同,需要改变策略,但是mutex、condition_variable、flag三个全局变量配合达到控制目的是必不可少的,另外while也是实现控制的必要技巧,其它不确定技巧也基本是利用while实现。

c++11线程之条件变量condition_variable(二)

时间: 2024-08-08 21:48:29

c++11线程之条件变量condition_variable(二)的相关文章

c++11线程之条件变量condition_variable

题目:子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码. [cpp] view plaincopyprint? #include<iostream> #include<thread> #include<mutex> #include<condition_variable> using namespace std; mutex m; condition_variab

C++11并行编程-条件变量(condition_variable)详细说明

<condition_variable >头文件主要包含有类和函数相关的条件变量. 包括相关类 std::condition_variable和 std::condition_variable_any,还有枚举类型std::cv_status.另外还包含函数 std::notify_all_at_thread_exit(),以下分别介绍一下以上几种类型. std::condition_variable 类介绍 std::condition_variable是条件变量,很多其它有关条件变量的定义

C++11并发编程-条件变量(condition_variable)详解

<condition_variable >头文件主要包含了与条件变量相关的类和函数.相关的类包括 std::condition_variable和 std::condition_variable_any,还有枚举类型std::cv_status.另外还包括函数 std::notify_all_at_thread_exit(),下面分别介绍一下以上几种类型. std::condition_variable 类介绍 std::condition_variable是条件变量,更多有关条件变量的定义参

C++ 11 并发: 正确 的使用条件变量-condition_variable

1. 标准实例 http://en.cppreference.com/w/cpp/thread/condition_variable 在cppreference提供的对 cv的例子,condition_variable和mutex都是全局变量.但是我们的程序不可能到处使用全局变量.如果把condition_variable和mutex的定义放到main函数中进去,作为局部变量,并且循环几次,会发现第一次同步OK,后面的就没有那么好的运气了. 因此对于局部变量中如何正确的使用condition_v

linux系统编程:线程同步-条件变量(cond)

线程同步-条件变量(cond) 生产者与消费者问题 再引入条件变量之前,我们先看下生产者和消费者问题:生产者不断地生产产品,同时消费者不断地在消费产品. 这个问题的同步在于两处:第一,消费者之间需要同步:同一件产品只可由一人消费.第二,当无产品可消费时,消费者需等待生产者生产后,才可继续消费,这又是一个同步问题.详细了解:生产者消费者问题. 条件变量 条件变量是利用线程间共享的全局变量进行同步的一种机制,并且条件变量总是和互斥锁结合在一起. 相关函数 pthread_cond_t //条件变量类

pThread线程(三) 线程同步--条件变量

条件变量(Condition Variables) 参考资料:http://game-lab.org/posts/posix-thread-cn/#5.1 条件变量是什么? 条件变量为我们提供了另一种线程间同步的方法,然而,互斥量是通过控制线程访问数据来实现同步,条件变量允许线程同步是基于实际数据的值. 如果没有条件变量,程序员需要让线程不断地轮询,以检查是否满足条件.由于线程处在一个不间断的忙碌状态,所以这是相当耗资源的.条件变量就是这么一个不需要轮询就可以解决这个问题的方法. 条件变量总是跟

linux网络编程-----&gt;线程同步--&gt;条件变量

开发使用多线程过程中, 不可避免的会出现多个线程同时操作同一块共享资源, 当操作全部为读时, 不会出现未知结果, 一旦当某个线程操作中有写操作时, 就会出现数据不同步的事件. 而出现数据混乱的原因: 资源共享(独享资源则不会) 调试随机(对数据的访问会出现竞争) 线程间缺少必要的同步机制 以上三点, 前两点不能被改变. 欲提高效率, 传递数据, 资源必须共享. 只要资源共享, 就一定会出现线程间资源竞争, 只要存在竞争关系, 数据就会出现混乱. 所以只能从第三点着手, 使多个线程在访问共享资源的

线程同步-条件变量

条件变量的使用:将互斥量的忙等机制改为通知机制 涉及到的函数有以下几个: int pthread_cond_destroy(pthread_cond_t *cond); /********************** *功能:条件变量的初始化 *参数:cond:条件变量 * attr:条件变量的属性 * ********************/ int pthread_cond_init(pthread_cond_t *restrict cond , const pthread_condatt

线程同步——条件变量

1.互斥量的存在问题:     互斥量是线程程序必需的工具,但它们并非万能的.例如,如果线程正在等待共享数据内某个条件出现,那会发生什么呢?它可以重复对互斥对象锁定和解锁,每次都会检查共享数据结构,以查找某个值.但这是在浪费时间和资源,而且这种繁忙查询的效率非常低. 在每次检查之间,可以让调用线程短暂地进入睡眠,比如睡眠三秒钟,但是因此线程代码就无法最快作出响应.真正需要的是这样一种方法:当线程在等待满足某些条件时使线程进入睡眠状态.一旦条件满足,就唤醒因等待满足特定条件而睡眠的线程.如果能够做