采自文章: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();

最新文章

  1. prefix pct文件配置Xcode
  2. c#控制台調用SSIS包互传值
  3. 26 BasicUsageEnvironment基本使用环境——Live555源码阅读(三)UsageEnvironment
  4. java 后台校验格式
  5. 模拟一下goldengate中断后,重新同步操作
  6. C#之装箱和拆箱
  7. Ansj分词双数组Trie树实现与arrays.dic词典格式
  8. struts2之入门login
  9. 一台服务器同时搭建IIS和WAMP,利用WAMP 80端口转发
  10. data Mining with Weka: Trailer More Data Mining with Weka 用weka 进行数据挖掘 Weka 用weka 进行更多数据挖掘
  11. pip --upgrade批量更新过期的python库
  12. 版本控制工具之git
  13. JAVAWEB 一一框架整合(SSI : Spring+SpringMVC+ ibtis)
  14. netty4初步使用
  15. ICCV2013、CVPR2013、ECCV2013目标检测相关论文
  16. windows10移动热点打开后手机不能上网
  17. Discuz论坛管理的问题汇总
  18. Python 迭代dict的value
  19. “全栈2019”Java第九十九章:局部内部类与继承详解
  20. 在windows上部署使用Redis--资料整理

热门文章

  1. @confirguration(proxyBeanMethods = false)的作用,如何选择Full模式和Lite模式
  2. Linux备份文件加“时间”命令
  3. Oracle数据库允许最大连接数
  4. Oracle性能优化之内存管理
  5. 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes
  6. 嵌入式-c语言基础:冒泡排序实现从大到小排列
  7. xshell取消置顶
  8. 安装BurpSuite (专业版)
  9. POST请求发送的表单数据和json数据的区别及python代码实现
  10. js-day04-作业