复杂的线程同步问题,请教高手

ipxspx 2003-10-20 12:31:19
如何做到:
1。一个线程a定期通知一组工作线程停止
2。工作线程接到停止信号后做收尾工作并暂停,所有的工作线程都暂停后通知线程a
3.线程a得到通知后更新一些数据后再通知工作线程重新开始工作

哪位由经验庆说说
...全文
34 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChinaPlayer 2004-01-24
  • 打赏
  • 举报
回复
mark
ipxspx 2003-10-20
  • 打赏
  • 举报
回复
工作线程是傻转的,我用signal已经可以做到通知a
但是线程a得到通知后更新一些数据后再通知工作线程重新开始工作还没有成功
zzxt 2003-10-20
  • 打赏
  • 举报
回复
首先需要知道得是你的这些工作线程是怎么驱动的,
如果是消息驱动的,就用msg来实现。
如果是那种傻转的,就用signal来实现。
通知a的话可以用semphore来实现,
线程间通讯还是比较简单的,毕竟地址空间等资源是共享的。
ipxspx 2003-10-20
  • 打赏
  • 举报
回复
代码是可以用的,因为我测试的时候,实际工作线程数与a线程中workCount不一致导致
不能工作,谢谢大家,参与又分
ipxspx 2003-10-20
  • 打赏
  • 举报
回复
下面是我的代码,为什么工作不正常,
pthread_mutex_t mutex_Count = PTHREAD_MUTEX_INITIALIZER;

pthread_cond_t cond_Count = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond_Done = PTHREAD_COND_INITIALIZER;

int workCount=0;
int aDone=0;
void *aThread(void *arg)
{
for(;;)
{

sleep(20);
printf("\nwait aThread start");

pthread_mutex_lock (&mutex_Count);
workCount=4;
aDone=0;
printf("\nwait workThread paused");
while(workCount!=0)
pthread_cond_wait(&cond_Count,&mutex_Count);

printf("\nstart update a table");
sleep(5);
printf("\nend update a table");
aDone=1;
printf("\nwake up workThread");
pthread_cond_broadcast(&cond_Done);
pthread_mutex_unlock (&mutex_Count);
}

return NULL;
}
void *workThread(void *arg)
{
for(;;)
{
checkaReady();
printf("i am working");
}
}

int checkaReady()
{
pthread_mutex_lock (&mutex_Count);
if (workCount!=0)
{
workCount--;
printf("\nwork %d paused",workCount+1);
if (workCount==0)
{
pthread_cond_signal (&cond_Count);
printf("\nwake up aThread");
}
while(aDone==0)
pthread_cond_wait(&cond_Done,&mutex_Count);
printf("\nworker worked");
}
pthread_mutex_unlock (&mutex_Count);


return 1;
}
flyooh 2003-10-20
  • 打赏
  • 举报
回复
全局变量: lock_count,由a和工作线程工作设置
全局变量: can_continue,由线程a设定
全局变量: work_cond(pthread_cond_t),work_mutex(pthread_mutex_t)用于工作线程等待

worker_thread中:
1.can_continue = 1; //工作线程可以继续
2.can_continue = 0;
lock_count++;

a中:
1.如果想工作线程停下来:
can_continue = 0;
lock_count = 0;
2.等待直到lock_count=工作线程数目,然后做修改动作
3. can_continue = 1;
pthread_cond_signal(&work_cond);

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧