#include <boost/thread.hpp>

#include <iostream>

#include <vector>

#include <cstdlib>

#include <ctime>



boost::mutex mutex;

boost::condition_variable_any cond;

std::vector<int> random_numbers;



void fill()

{

  std::srand(static_cast<unsigned int>(std::time(0)));

  for (int i = 0; i < 3; ++i)

  {

    boost::unique_lock<boost::mutex> lock(mutex);

    random_numbers.push_back(std::rand());

    cond.notify_all();

    cond.wait(mutex);

  }

}



void print()

{

  std::size_t next_size = 1;

  for (int i = 0; i < 3; ++i)

  {

    boost::unique_lock<boost::mutex> lock(mutex);

    while (random_numbers.size() != next_size)

    {

      cond.wait(mutex);

    }

    std::cout << random_numbers.back()<<"---" << std::endl;

    ++next_size;

    cond.notify_all();

  }

}



int main()

{

  boost::thread t1(fill);

  boost::thread t2(print);

  t1.join();

  t2.join();

}

编译后输出:

703604841---

397897602---

2011646528---

这个样例的程序删除了 wait()count()

线程不用在每一个循环迭代中等待一秒。而是尽可能快地运行。此外。没有计算总额。数字全然写入标准输出流。

为确保正确地处理随机数,须要一个同意检查多个线程之间特定条件的条件变量来同步不每一个独立的线程。

正如上面所说。 fill() 函数用在每一个迭代产生一个随机数,然后放在 random_numbers 容器中。 为了防止其它线程同一时候訪问这个容器。就要对应得使用一个排它锁。

不是等待一秒。实际上这个样例却用了一个条件变量。

调用
notify_all() 会唤醒每一个哪些正在分别通过调用wait() 等待此通知的线程。

通过查看 print() 函数里的 for 循环。能够看到同样的条件变量被
wait() 函数调用了。

假设这个线程被 notify_all() 唤醒,它就会试图这个相互排斥量。但仅仅有在
fill() 函数全然释放之后才干成功。

这里的窍门就是调用 wait() 会释放对应的被參数传入的相互排斥量。 在调用
notify_all()
后, fill() 函数会通过
wait()
对应地释放线程。

然后它会阻止和等待其它的线程调用 notify_all() 。一旦随机数已写入标准输出流,这就会在
print() 里发生。

注意到在 print() 函数里调用 wait() 其实发生在一个单独
while 循环里。

这样做的目的是为了处理在 print() 函数里第一次调用
wait() 函数之前随机数已经放到容器里。 通过比較 random_numbers 里元素的数目与预期值,发现这成功地处理了把随机数写入到标准输出流。

#include<boost/thread.hpp>

#include<iostream>



using namespace std;



void f1(){

    cout<<"f1()"<<endl;

}



void f2(){

    cout<<"f2()"<<endl;

}





int main(){

    boost::thread_group grp;

    for(int i=0;i<3;++i)

    {

        grp.create_thread(f1);

    }

    grp.add_thread(new boost::thread(f2));



    cout<<grp.size()<<endl;



    grp.join_all();



    return 1;

}



编译后输出:

4

f1()

f1()

f2()

f1()

这个程序演示了线程组的使用方法。

Unix C++(boost) 线程同步和线程组的更多相关文章

  1. iOS开发——高级篇——线程同步、线程依赖、线程组

    前言 对于iOS开发中的网络请求模块,AFNet的使用应该是最熟悉不过了,但你是否把握了网络请求正确的完成时机?本篇文章涉及线程同步.线程依赖.线程组等专用名词的含义,若对上述名词认识模糊,可先进行查 ...

  2. 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)

    Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...

  3. C# 多线程编程第二步——线程同步与线程安全

    上一篇博客学习了如何简单的使用多线程.其实普通的多线程确实很简单,但是一个安全的高效的多线程却不那么简单.所以很多时候不正确的使用多线程反倒会影响程序的性能. 下面先看一个例子 : class Pro ...

  4. Python并发编程-进程 线程 同步锁 线程死锁和递归锁

    进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...

  5. Java并发——线程安全、线程同步、线程通信

    线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...

  6. Java多线程(二) —— 线程安全、线程同步、线程间通信(含面试题集)

    一.线程安全 多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性,就可以称作是线程安全的. 讲到线程安全问题,其实是指多线程环境下对共享资源的访问可能会 ...

  7. Python3 进程 线程 同步锁 线程死锁和递归锁

    进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...

  8. Java线程同步和线程通信

    一.线程同步 当多个线程访问同一个数据时,非常容易出现线程安全问题.这时候就需要用线程同步. 不可变类总是线程安全的,因为它的对象状态是不可改变的,但可变类对象需要额外的方法来保证线程安全. 1.同步 ...

  9. 四十三、Linux 线程——线程同步之线程信号量

    43.1 信号量 43.1.1 信号量介绍 信号量从本质上是一个非负整数计数器,是共享资源的数目,通常被用来控制对共享资源的访问 信号量可以实现线程的同步和互斥 通过 sem_post() 和 sem ...

  10. Java-多线程第三篇3种创建的线程方式、线程的生命周期、线程控制、线程同步、线程通信

    1.Java使用Thread类代表线程.     所有的线程对象必须是Thread类或其子类的实例. 当线程继承Thread类时,直接使用this即可获取当前线程,Thread对象的getName() ...

随机推荐

  1. 各版本 linux(转)

    Linux各种版本下载 ftp://ftp.linuxforum.net/ISO/Redhat7.3/valhalla-i386-disc1.iso ftp://ftp.linuxforum.net/ ...

  2. JS中区分参数方法

    实现功能:在使用cocosjs制作游戏过程中,很多东西都可以重复使用,例如菜单栏等等.今天尝试写了一个自定义的Js文件用作菜单方便以后使用. 将菜单按钮,以及触发事件作为参数生成一个层 直接在游戏中使 ...

  3. JS字符串常用方法

      // 来自 http://www.runoob.com/js/js-strings.html   var str01 = "odd open xboxone" , str02 ...

  4. 你好,C++(33)对象生死两茫茫 6.2.3 一个对象的生与死:构造函数和析构函数

    6.2.2  使用类创建对象 完成某个类的声明并且定义其成员函数之后,这个类就可以使用了.一个定义完成的类就相当于一种新的数据类型,我们可以用它来定义变量,也就是创建这个类所描述的对象,表示现实世界中 ...

  5. date命令详解与练习

    date : 用来打印或设置系统日期和时间. 它在linux shell编程中经常会用到.比如每天生成随日期变化的档案名,尤其在银行业务中每天都会生成流水文件.eg:datefile=$(date & ...

  6. 实现跨线程访问UI控件的3种方法

    namespace 多线程 { public partial class Form2 : Form { public Form2() { InitializeComponent(); } privat ...

  7. Unity扩展编辑器--类型1:Editor Windows

    Extending the Editor Unity允许你使用自己定制的inspectors和Editor Windows扩展编辑器,并且你可以使用定制的Property Drawers定义属性集在i ...

  8. 转:Netty系列之Netty高性能之道

    1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用 ...

  9. LA 小、杂、乱题合辑

    ${\Large 1.}$(来自丘维声『高等代数』(上)$P_{189,194}$) $(1).$ 设$A,B$分别是数域${\mathbb F}$上$n\times n,m\times n$矩阵. ...

  10. CSS中.和#区别

    一.问题来源 制作导航栏,参考别人的代码,发现的. 二.解析 2.1 概述 id:用来定义页面中大的样式,如栏目划分,顶部,正文,底部等:用#top的形式来定义: class:用来定义一些比较细节的样 ...