Unix C++(boost) 线程同步和线程组
#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) 线程同步和线程组的更多相关文章
- iOS开发——高级篇——线程同步、线程依赖、线程组
前言 对于iOS开发中的网络请求模块,AFNet的使用应该是最熟悉不过了,但你是否把握了网络请求正确的完成时机?本篇文章涉及线程同步.线程依赖.线程组等专用名词的含义,若对上述名词认识模糊,可先进行查 ...
- 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)
Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...
- C# 多线程编程第二步——线程同步与线程安全
上一篇博客学习了如何简单的使用多线程.其实普通的多线程确实很简单,但是一个安全的高效的多线程却不那么简单.所以很多时候不正确的使用多线程反倒会影响程序的性能. 下面先看一个例子 : class Pro ...
- Python并发编程-进程 线程 同步锁 线程死锁和递归锁
进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...
- Java并发——线程安全、线程同步、线程通信
线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...
- Java多线程(二) —— 线程安全、线程同步、线程间通信(含面试题集)
一.线程安全 多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性,就可以称作是线程安全的. 讲到线程安全问题,其实是指多线程环境下对共享资源的访问可能会 ...
- Python3 进程 线程 同步锁 线程死锁和递归锁
进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...
- Java线程同步和线程通信
一.线程同步 当多个线程访问同一个数据时,非常容易出现线程安全问题.这时候就需要用线程同步. 不可变类总是线程安全的,因为它的对象状态是不可改变的,但可变类对象需要额外的方法来保证线程安全. 1.同步 ...
- 四十三、Linux 线程——线程同步之线程信号量
43.1 信号量 43.1.1 信号量介绍 信号量从本质上是一个非负整数计数器,是共享资源的数目,通常被用来控制对共享资源的访问 信号量可以实现线程的同步和互斥 通过 sem_post() 和 sem ...
- Java-多线程第三篇3种创建的线程方式、线程的生命周期、线程控制、线程同步、线程通信
1.Java使用Thread类代表线程. 所有的线程对象必须是Thread类或其子类的实例. 当线程继承Thread类时,直接使用this即可获取当前线程,Thread对象的getName() ...
随机推荐
- SQL Server 2008中数据压缩
SQL Server 2008中引入了数据压缩的功能,允许在表.索引和分区中执行数据压缩.这样不仅可以大大节省磁盘的占用空间,还允许将更多数据页装入内存中,从而降低磁盘IO,提升查询的性能.当然,凡事 ...
- scrolView
禁止UIScrollView垂直方向滚动,只允许水平方向滚动 scrollview.contentSize = CGSizeMake(长度, 0); 禁止UIScrollView水平方向滚动,只允许 ...
- 监听器启动顺序和java常见注解
- ubuntu下apache与php配置
实验环境 uname -a Linux tomato 4.4.0-34-generic #53-Ubuntu SMP Wed Jul 27 16:06:39 UTC 2016 x86_64 x86_6 ...
- uvalive 5721 Activation (概率dp+方程)
题目链接:http://vjudge.net/problem/viewProblem.action?id=24999 主要思想就是解方程的思想. 二维dp应该很容易想到,就是当前位置加队伍长度. dp ...
- spring 入门笔记(一)
最近学习spring 通过笔记形式加深自己对spring的理解,也希望能跟各位入门者分享和讨论. 一.下载spring 下载spring也费了不少功夫,目前还没从spring官网找到下载入口,我从下面 ...
- mysql hash索引优化
创建表 CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `msg` varchar(20) NOT NULL DEFAULT ' ...
- memcache 数据库信息存储到数据库减少IO 操作
在实际应用中,通常会把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担.通常会 将 SQL ...
- jquery 导航栏目
JS 文件<script type="text/javascript"> $(document).ready(function(){ $(".level1 & ...
- SAR-303 xml validator验证框架
// 配置文件详解 <mvc:annotation-driven validator="validator" /> <bean id="validato ...