// 方法1:直接构建N个THread来run
foreach (i, size)
{
thread trd(&Instance::doWork, &inst);
lstTrd.push_back(trd);
} foreach(lstTrd, join); // 方法2:使用notify的方式来处理分步骤任务 class threadsafe_queue
{
queue<int> q;
mutex m;
condition_variable cond;
public:
void push(int i)
{
lock_guard<mutex> lk(m);
q.push_back(i);
cond.notify_one();
} void wait_and_pop(int &i)
{
unique_lock<mutex> lk(m);
cond.wait(lk, [this]{ return !q.empty(); } );
i = q.front();
q.pop();
}
} class Instance
{
// 存储原始的用于处理的n个数目的数据
List<GDSLayer> lstInfo;
...
// 存储最终的数据(其实应该每个步骤都有中间过程数据产生)
List<Result> lstResult; // 每个步骤完成就往对应的queue里面把完成的数据的index插入,而下一个线程就在等待这个队列有元素
// 于是对于数据index = 0就会进行:A->B->C...
threadsafe_queue merge_q;
threadsafe_queue match_q;
threadsafe_queue GDSPinGen_q;
threadsafe_queue OBSGen_q;
threadsafe_queue LEFPin_q;
public:
void merge_thread()
{
// 如果发生错误,那么是否要符合没有到size也可以退出
// 事先是否要把所有可能的操作数的空间都分配好,免得如果先操作0,结果notify到了3,然后操作3,虽然原始数据有,但存储过程数据还没有
// 同时,Log信息处理是否可行?中间检查信息的操作是安全的吗?
// 但这样,每个thread只负责一个步骤,处理完一个数据才处理下一个(是否如此?)按理来说是不会存在跨越的问题
foreach (i, lstInfo.size())
{
bool b_state = doMerge(lstInfo[i]);
if (b_state)
merge_q.push_back(i);
}
} void match_thread()
{
foreach(i, lstInfo.size())
{
int key = -;
merge_q.wait_and_pop(key);
bool b_state = doMatch( lstInfo[ key ] );
if (b_state)
{
match_q.push_back( key );
}
}
} void GDSPinGen_thread()
{} void OBSGen_thread()
{} void LEFPin_thread()
{}
}

方法3:使用async

方法4:使用package_task
 方法5:使用promise

方法6:使用线程池

[并发编程]使用线程安全队列和条件变量的notify来安排分步骤任务的更多相关文章

  1. Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  2. 并发编程 13—— 线程池的使用 之 配置ThreadPoolExecutor 和 饱和策略

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  3. Java并发编程:线程池的使用(转)

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  4. Java并发编程:线程池的使用(转载)

    转载自:https://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  5. Java并发编程:线程池的使用(转载)

    文章出处:http://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  6. [转]Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  7. 【转】Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  8. 13、Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  9. Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

随机推荐

  1. MateSublg

    MateSublg 说明 使用MetaWeblog的方式提交文章,并自动上传图片. 本插件的官方地址:MateSublg – Sollyu博客 本插件的开源地址:sollyu / MetaSubolg ...

  2. 九度OJ 1527 首尾相连数组的最大子数组和 -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1527 题目描述: 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相 ...

  3. Python没有执行__init__

    疑惑 提出问题 前天同事问我一个问题,为什么这个脚本中的没有调用A 的__init__.脚本如下: class A(object): def __init__(self, *args, **kwarg ...

  4. 诡异的XmlSerializer属性字段Specified

    自动生成代码时,往往会为一个字段假设为 * , 生成另一个bool型字段: *Specified: 如: [Serializable] public class A { [XmlElement] pu ...

  5. ezSQL 数据库操作类

    http://justinvincent.com 官网,一切尽在里面的下载帮助文件中,妙哉也!! ez_sql_core.php <?php /************************* ...

  6. 手机摇一摇效果-html5

    1.手机摇一摇效果实现 2.播放声音 <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  7. 跨域、sql注入、xss攻击

    这几天遇到这三个问题,现在简单的记录下来. 1.跨域 如我服务器的域名是www.test1.com,我在另一个服务器www.test2.com通过ajax访问www.test1.com的数据时,就引起 ...

  8. 服务器返回的JSON字符串

    异步请求将type设为"json",或者利 用$.getJSON()方法获得服务器返回,那么就不需要eval()方法,因为这时候得到的结果已经是json对象

  9. linux安装ruby ruby-devel rubygems bundler

    linux安装ruby ruby-devel rubygems yum install ruby ruby-devel rubygems 安装bundler gem install bundleror ...

  10. Hadoop中的RPC

    基于hadoop2.6.4,RPC相关的实现位于hadoop-common这个project中hadoop-common-project/hadoop-common/src/main/java的包pa ...