Boost线程处理机制
采自文章:https://www.cnblogs.com/renyuan/p/6613638.html
大多数共享数据的线程均采用
boost::mutex mtx;
boost::condition_variable condition;
boost::thread consume_thread; 三者相互配合
1:添加数据的时候采用互斥锁,锁住共享数据
queue( Queue& queue, const Entry& e )
{
boost::mutex::scoped_lock lock( mtx );
auto queue_size = queue.size();
if( queue_size > max_queue_size ) {
lock.unlock();
condition.notify_one();
queue_sleep_time += 10;
if( queue_sleep_time > 1000 )
wlog("queue size: ${q}", ("q", queue_size));
boost::this_thread::sleep_for( boost::chrono::milliseconds( queue_sleep_time ));
lock.lock();
} else {
queue_sleep_time -= 10;
if( queue_sleep_time < 0 ) queue_sleep_time = 0;
}
queue.emplace_back( e );
lock.unlock();
condition.notify_one();
}
2:读取数据的时候也要使用互斥锁锁住共享数据,用condition条件变量进行等待相互执行处理
条件变量的使用总是和互斥体及共享资源联系在一起的。线程首先锁住互斥体,然后检验共享资源的状态是否处于可使用的状态。如果不是,那么线程就要等待条件变量。要指向这样的操作就必须在等待的时候将互斥体解锁,以便其他线程可以访问共享资源并改变其状态。它还得保证从等到得线程返回时互斥体是被上锁得。当另一个线程改变了共享资源的状态时,它就要通知正在等待条件变量得线程,并将之返回等待的线程。
while (true) {
boost::mutex::scoped_lock lock(mtx);
while ( transaction_metadata_queue.empty() &&
transaction_trace_queue.empty() &&
block_state_queue.empty() &&
irreversible_block_state_queue.empty() &&
!done ) {
condition.wait(lock);
lock.unlock();
}
3: 创建线程
consume_thread = boost::thread([this] { consume_blocks(); });
4:释放资源
condition.notify_one();
consume_thread.join();
最新文章
- prefix pct文件配置Xcode
- c#控制台調用SSIS包互传值
- 26 BasicUsageEnvironment基本使用环境——Live555源码阅读(三)UsageEnvironment
- java 后台校验格式
- 模拟一下goldengate中断后,重新同步操作
- C#之装箱和拆箱
- Ansj分词双数组Trie树实现与arrays.dic词典格式
- struts2之入门login
- 一台服务器同时搭建IIS和WAMP,利用WAMP 80端口转发
- data Mining with Weka: Trailer More Data Mining with Weka 用weka 进行数据挖掘 Weka 用weka 进行更多数据挖掘
- pip --upgrade批量更新过期的python库
- 版本控制工具之git
- JAVAWEB 一一框架整合(SSI : Spring+SpringMVC+ ibtis)
- netty4初步使用
- ICCV2013、CVPR2013、ECCV2013目标检测相关论文
- windows10移动热点打开后手机不能上网
- Discuz论坛管理的问题汇总
- Python 迭代dict的value
- “全栈2019”Java第九十九章:局部内部类与继承详解
- 在windows上部署使用Redis--资料整理