d****f 发帖数: 313 | 1 工作中牵涉到一个稍微复杂一点的线程同步问题,问题描述如下:
有两个thread:t1和t2
1、t1做N个时间步,t2做一个时间步(都是差分时间步),换句话说每个t2和N个t1同步
2、同步时,t1和t2要交换一下数据,t1先传1个链表tL1给t2,t2用这个tL1算两个链表
值(DataProcess),tL2a,tL2b,一个要回传给t1(tL2a,之后t1的N步都要用到这个tL2a
),另一个tL2b是t2下一步自己计算要用到的,这个过程是串行(原来并行的强制串行
).
3、交换完数据,t1和t2各自完成自己时间步计算,这个过程中t1做一个积分(N步),
t2解一个方程,无论哪个先完成,都需要等到双方都完成了,才能开始下一轮的计算(
也就是回到2),这个过程是并行的.
我贴了一个简单的框架,只是保证t1做一步,t2做一步,因为刚开始接触并行内容,所
以请各位大牛指点一下,这个每轮先串行后并行的过程如何实现,比如是不是需要两个
mutex,两个condition variable,等等,希望我已经描述清楚了, 谢谢!稍微有点提示也非常欢迎!
#include
# |
b***n 发帖数: 462 | 2 没用过这个,不是很懂,有问题:
f2中应该锁t2_mutex 吧。
f1中 t1_ready = 1 在 if (1==t1_ready) 后面能行吗?这个没看明白。这样的会少一次的变量传递吧。
学习了。 |
d****f 发帖数: 313 | 3
只有锁同一个mutex,才有互斥的可能啊,锁了两个mutex就毫无意义了
一次的变量传递吧。
t1_ready=1表示t1的工作做完了,做完之后要用该标志量,解锁t2线程,如果不用标志量,
可能导致condion signal丢失的
【在 b***n 的大作中提到】 : 没用过这个,不是很懂,有问题: : f2中应该锁t2_mutex 吧。 : f1中 t1_ready = 1 在 if (1==t1_ready) 后面能行吗?这个没看明白。这样的会少一次的变量传递吧。 : 学习了。
|
b***n 发帖数: 462 | 4 t2_mutex 是我想岔了。
f1中 t1_ready = 1 在 if (1==t1_ready) 后面能,也就是说,每两次 (0==(it1 % N
))才能又一次进入 if (1==t1_ready),让thread sleep。不知道这个是不是你要求的。
当f2加入进来,每一个循环都t1_ready=0, 那么,f1可能永远也没有机会进入sleep。
不知掉这样的话他们交换的数据是否是相同步骤的。
当临界情况发生的时候,能满足你的需求吗?
而且,会不会两个同时sleep?这个我还没想好。
不过学习了一下pthread_cond_wait,很有意思的一个东西。 |
b***n 发帖数: 462 | 5 还有一个,看手册,pthread_cond_wait最好使用while等待,因为有suprise wakeup的可能,这样就需要再次进入sleep。你的if 等待被suprise wakeup后会进入下一轮计算,这样的话是不是就不是你要得结果了?
所以最好是两个thread有各自的if condition。
现学现卖,一起讨论吧。 |
b***n 发帖数: 462 | 6 总觉得你这个需要步调一致,对数据的互斥反而可以通过步调控制。不知道是不是这样
。 |
p******g 发帖数: 347 | 7 Check out the CountdownLatch in Java. it's just what you needed, and it's
fairly easy to implement it with pthread semaphore or what ever
synchronization stuff. CyclicBarrier works for you, too.
同步
tL2a
【在 d****f 的大作中提到】 : 工作中牵涉到一个稍微复杂一点的线程同步问题,问题描述如下: : 有两个thread:t1和t2 : 1、t1做N个时间步,t2做一个时间步(都是差分时间步),换句话说每个t2和N个t1同步 : 2、同步时,t1和t2要交换一下数据,t1先传1个链表tL1给t2,t2用这个tL1算两个链表 : 值(DataProcess),tL2a,tL2b,一个要回传给t1(tL2a,之后t1的N步都要用到这个tL2a : ),另一个tL2b是t2下一步自己计算要用到的,这个过程是串行(原来并行的强制串行 : ). : 3、交换完数据,t1和t2各自完成自己时间步计算,这个过程中t1做一个积分(N步), : t2解一个方程,无论哪个先完成,都需要等到双方都完成了,才能开始下一轮的计算( : 也就是回到2),这个过程是并行的.
|