C++线程 -- boost::barrier解决多线程分工问题
2014-07-12 14:02
218 查看
问题描述:
在单线程逻辑中,在线程处理某个非常频繁事件时,而这个事件相对其他逻辑比较耗时。
这就像生产车间中,一个Main流水线在循环的执行流程工作,总是遇到一个非常频繁被执行且工作量大的流程挡着,为了来分担这个流程,那么我们开多个Work流水线去分担这个流程工作,且主流程去等待子流程的完成结果,再直接执行下面的流程。一旦Main流水线有单子下来分担给各个Work流水线去并行完成各个单子。Main线程就只负责拿到结果去完成下面的工作。
执行流程就上面的①->⑤,主线程显得很清闲,但是谁让这个Main线程是管理呢,不过它才是重责在肩啊,呵呵,貌似很合乎社会现状。
在单线程逻辑中,在线程处理某个非常频繁事件时,而这个事件相对其他逻辑比较耗时。
这就像生产车间中,一个Main流水线在循环的执行流程工作,总是遇到一个非常频繁被执行且工作量大的流程挡着,为了来分担这个流程,那么我们开多个Work流水线去分担这个流程工作,且主流程去等待子流程的完成结果,再直接执行下面的流程。一旦Main流水线有单子下来分担给各个Work流水线去并行完成各个单子。Main线程就只负责拿到结果去完成下面的工作。
那么我们可以建立一个线程 #include <boost/thread/barrier.hpp> 曾用过boost::barrier这个类,非常简单的实现,简单说就是:计数等待 barrier::barrier(unsigned int count) : m_threshold(count), m_count(count), m_generation(0) { if (count == 0) throw std::invalid_argument("count cannot be zero."); } 看最重要的函数 bool barrier::wait() { boost::mutex::scoped_lock lock(m_mutex); // m_mutex is the base of barrier and is initilized by it's default constructor. unsigned int gen = m_generation; // m_generation will be 0 for call 1~n-1, and 1 for n~2n - 1, and so on... if (--m_count == 0) { m_generation++; // cause m_generation to be changed in call n/2n/... m_count = m_threshold; // reset count m_cond.notify_all(); // wake up all thread waiting here return true; } while (gen == m_generation) // if m_generation is not changed, lock current thread. m_cond.wait(lock); return false; } 1、定义 main thread: struct thread_cntl { std::atomic<int> m_done_count; //线程计数器 int work_threadnumb; //线程数 定义两个boost::barrier boost::barrier bar_main(2) ; //为了等待main线程和其他工作线程,全部调用这激活 boost::barrier bar_work(work_threadnumb + 1); //所有Work线程等待和Main线程都调用后,激活 }; thread_cntl th_cntl; 2、执行流程 【】Work Thread:(每个工作线程所执行的事) while(1) { th_cntl.bar_work.wait(); //①所有线程就绪等待Main线程.wait激活,⑤继续下一次就绪 //从自己的工作列表中获取工作事件执行 do_work(); th_cntl.m_done_count++; //本Work线程执行完将计数加1 //所有线程都计数了,表示都完成了 if(th_cntl.m_done_count ==th_cntl.work_threadnumb) { //所有流水线全部完成了 th_cntl.bar_work->wait();//④最后一个线程也完成了任务调用Wait激活Main线程 } } 【】Main Thread th_cntl.bar_main.wait(); //②激活,开始工作 th_cntl.bar_work.wait();//③等待最后一个Work线程完成时调用.wait()
执行流程就上面的①->⑤,主线程显得很清闲,但是谁让这个Main线程是管理呢,不过它才是重责在肩啊,呵呵,貌似很合乎社会现状。
相关文章推荐
- 利用委托解决多线程中“不是此控件创建的线程”的问题
- 多线程(线程间通信-多生产者多消费者问题-JDK1.5解决办法-范例),停止线程,线程中方法的区别,匿名内部类实现多线程,线程总结
- BOOST::ASIO多线程下socket关闭导致进程崩溃问题定位及解决
- CountDownLatch和CyclicBarrier解决运动员赛跑多线程问题
- 解决多线程单例模式的线程不安全问题
- MatCom_C++(MultiThread)解决线程的冲突问题
- xgboost C++ window编译问题解决与安装
- JAVA基础再回首(二十四)——多线程的概述、实现方式、线程控制、生命周期、多线程程序练习、安全问题的解决
- 多线程委托之跨线程问题分析--在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke(解决方法已更新)
- 29-多线程(线程间通信-多生产者多消费者问题-JDK1.5新特性-Condition).1 2 31-多线程(线程间通信-多生产者多消费者问题-JDK1.5解决办法-范例). 1 2
- 关于杂碎的一些c++多线程编程问题,由winapi到boost::thread
- 基础篇_线程 第4集 多线程的安全问题--解决之道同步代码块
- C++ 多线程编程解决CPU占用率高问题
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition
- Delphi中多线程用Synchronize实现VCL数据同步显示 解决在线程中操作控件出现问题
- WinForm解决多线程操作控件问题 线程间操作无效: 从不是创建控件的线程访问它"
- Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会有解决很多问题]生产者消费者模型
- 23 API-多线程(多线程概述,多线程实现方案,线程控制常见方法,线程安全问题及解决)
- 多线程访问同一资源第二步 : 线程设置 以及 线程打印 用synchronized解决数据不匹配问题
- 7.[个人]C++线程入门到进阶(7)----多线程中的隐蔽问题揭秘