社区
Linux/Unix社区
帖子详情
复杂的线程同步问题,请教高手
ipxspx
2003-10-20 12:31:19
如何做到:
1。一个线程a定期通知一组工作线程停止
2。工作线程接到停止信号后做收尾工作并暂停,所有的工作线程都暂停后通知线程a
3.线程a得到通知后更新一些数据后再通知工作线程重新开始工作
哪位由经验庆说说
...全文
38
6
打赏
收藏
复杂的线程同步问题,请教高手
如何做到: 1。一个线程a定期通知一组工作线程停止 2。工作线程接到停止信号后做收尾工作并暂停,所有的工作线程都暂停后通知线程a 3.线程a得到通知后更新一些数据后再通知工作线程重新开始工作 哪位由经验庆说说
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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);
asp.net知识库
通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到...
秒杀多线程第五篇 经典
线程同步
关键段CS
上一篇《秒杀多线程第四篇 一个经典的多
线程同步
问题
》提出了一个经典的多
线程同步
互斥
问题
,本篇将用关键段CRITICAL_SECTION来尝试解决这个
问题
。 本文首先介绍下如何使用关键段,然后再深层次的分析下关键段的...
请教
高手
,线程
问题
,怎样暂停或杀掉多线程
比如在主类中有2个线程, thread1 a = new thread1();//做动画1 thread2 b = new thread2();//做动画2 a.start(); b.start();
问题
是:点击按钮怎样使线程暂停或杀掉,且杀掉线程时,画图清空? 热烈...
Java线程(八):锁对象Lock-同步
问题
更完美的处理方式
Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理
线程同步
问题
,我们拿Java线程(二)中的一个例子简单的实现一下和...
线程的变量
问题
,
请教
大侠!
线程的变量
问题
,
请教
大侠! VCL组件开发及应用http://www.delphi2007.net/DelphiVCL/html/delphi_20061222154739181.html 主进程中有一个panel对象,创建一个进程thread.create(panel),传入panel对象,然后在进程...
Linux/Unix社区
23,121
社区成员
74,508
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章