Pthread一个牵涉两个线程同步,每轮先串行后并行的问题

dbxmcf 2010-07-21 07:45:22
工作中牵涉到一个稍微复杂一点的线程同步问题,问题描述如下:
有两个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 <stdio.h>
#include <stdlib.h>
#include <pthread.h>

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<NT1;it1++)
{
/*start to make a serial data transfer, t1 must be ahead of t2*/
if (0==(it1 % N))
{
pthread_mutex_lock( &t1_mutex );
if (1==t1_ready)
{
printf("t1 waiting on: %3d\n",it1);
pthread_cond_wait( &cv_t2_ready, &t1_mutex );
}
t1_ready = 1;
printf("t1: %3d (to t2)\n",it1);
pthread_cond_signal( &cv_t1_ready );
pthread_mutex_unlock( &t1_mutex );
}
else
{
printf("t1: %3d \n",it1);
}
}
return(NULL);
}

void *t2_func() /*t2 thread*/
{
for(it2=0;it2<NT2;it2++)
{
pthread_mutex_lock( &t1_mutex );
if (0==t1_ready)
{
printf("t2 waiting on: %3d\n",it2);
pthread_cond_wait( &cv_t1_ready, &t1_mutex );
}
t1_ready=0;
printf("t2: %3d (to t1)\n",it2);
pthread_cond_signal( &cv_t2_ready );
pthread_mutex_unlock( &t1_mutex );
}
return(NULL);
}

...全文
57 点赞 收藏 2
写回复
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
FancyMouse 2010-07-21
线程共享地址空间,所以数据只要不是放在每个线程私有的栈里的话就能访问,不需要特意去做交换数据的操作。但注意一切放在共享空间里的东西读写全都加mutex。
如果需要等待另一个线程结束那就用barrier。俺记得pthread是有barrier的。
回复
fanster28_ 2010-07-21
楼主的这个明显用barrier就搞定了
pthread 是有barrier的 就算没有也可以自己用signal来控制
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告