当前位置: 技术问答>linux和unix
Pthread一个牵涉两个线程同步,每轮先串行后并行的问题
来源: 互联网 发布时间:2016-09-12
本文导语: 工作中牵涉到一个稍微复杂一点的线程同步问题,问题描述如下: 有两个thread:t1和t2 1、t1做N个时间步,t2做一个时间步(都是差分时间步),换句话说每个t2和N个t1同步 2、同步时,t1和t2要交换一下数据,t1先传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,等等,希望我已经描述清楚了, 谢谢!
有两个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
#include
#include
pthread_mutex_t t1_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t t2_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cv_t2_ready = PTHREAD_COND_INITIALIZER;
pthread_cond_t cv_t1_ready = PTHREAD_COND_INITIALIZER;
void *t1_func();
void *t2_func();
int it1;
int it2;
int t1_ready=0;
#define NT2 5
#define N 3
#define NT1 NT2*N
main()
{
pthread_t thread1, thread2;
pthread_create( &thread1, NULL, &t1_func, NULL);
pthread_create( &thread2, NULL, &t2_func, NULL);
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
exit(0);
}
void *t1_func() /*t1 thread*/
{
for(it1=0;it1
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。