如何通知程序的多个线程结束?高分欢迎大家讨论。

fullsail 2003-08-03 09:53:25
一个多线程的程序,各个线程都是无限循环程序,工作函数类似如下:
thread()
{
for(;;){ do ...}
}

在外部条件触发的情况下,要退出,(比如Ctrl +C ,Kill信号等)。这就要通知各个工作的线程结束自己的循环?

通知的方法当然有很多种,
A.用全局变量。
B.使用事件Event。
C.封装通知变量或者事件。这种方法无非是前面两种方法的OO扩展。

在候Sir的Win32多线程编程的那本书种其推荐的是使用事件通知工作线程,当然这样有好处,比如变量可能被优化出问题,而且可能改变。

但我这样的一些想法:很多时候使用变量已经足够完成通知结束这个任务?
1.变量的优化问题可以通过voliate修饰符号解决。
2.结束的通知一般不会在被改变。Win32的事件有更复杂的用处,通知结束这个情况并不复杂。
3.UNIX下没有事件,ACE类库是自己模拟出的事件出来方式。通用性上其实有负担。

你的感觉呢?欢迎大家讨论。



...全文
350 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
OSNC_17 2003-08-17
  • 打赏
  • 举报
回复
foxfur 2003-08-17
  • 打赏
  • 举报
回复
学习……
fullsail 2003-08-17
  • 打赏
  • 举报
回复
ACE有一个非常好的线程管理类。
Kaye 2003-08-15
  • 打赏
  • 举报
回复
把线程管理封装在一个类里面就好弄了,呵呵
lile2002 2003-08-14
  • 打赏
  • 举报
回复
。。。这个问题似乎不是进程同步,互诉的问题吧, 用不着信号量
而是一个死锁问题,如果用信号量的话。。如果复杂的机制,就麻烦了
还是使用事件通知工作线程吧,管理起来方便,可以处理复杂的问题,
单纯用变量的化,如果多个线程同时跳出,是不是还要处理变量的访问控制问题等。
fullsail 2003-08-14
  • 打赏
  • 举报
回复
访问是可能的,用自己封装,voliate修饰变量。

这是使用Event的一个理由,见前面我的说明,我认为如果使用Sleep时,结束时时不能叙述退出的,所以最好还是用WaitforSingleObject一类的法子等待Event。
jack_wq 2003-08-13
  • 打赏
  • 举报
回复
水平不够,我来学习,收藏!
ckacka 2003-08-13
  • 打赏
  • 举报
回复
to step_by_step(脚印):
mutex是互斥量吧?和信号量有差别的,mutex相当于一个简化的信号量。至少windows下是这样区分的。
不懂unix,不过从字面是这样理解的。^_^

说得不对的话,还请指正!
fullsail 2003-08-13
  • 打赏
  • 举报
回复
自己Up一次。
widewave 2003-08-13
  • 打赏
  • 举报
回复
用断电的方式来确保结束各个线程。
widewave 2003-08-09
  • 打赏
  • 举报
回复
我是使用全局变量来控制退出,用Event来控制同步.不知道会不会有问题?
fixopen 2003-08-08
  • 打赏
  • 举报
回复
感觉各位的讨论偏离了主题。

通知各线程?什么意思?请注意:线程们是在同一个地址空间的。
用信号量去通知?要求每一个线程都得不断的检查信号量吧。
用消息或事件去通知?要求每一个线程都有消息队列吧。

这不是一个同步问题,只是一个生死问题。楼主说每个线程都是死循环,那是不会自然死亡了,那线程的死就只有一个办法,kill it.

当然,对于每个线程,如果关心它的状态的话,那么就应该由线程自杀来解决问题。用信号量通知是比较合适的。这要有每个线程看上去是死循环,但是有一个跳出的机制。不断的检查信号量吧。当发现需要杀身成仁时,从容的体面的死掉。
xiaoyuerisdahai 2003-08-08
  • 打赏
  • 举报
回复
关注ing ,up
lbaby 2003-08-08
  • 打赏
  • 举报
回复
不好意思,上边的"信号"应为"信号量"之误
偶刚学,不怕大家笑,现炒现卖一下:

//试一下用信号量解决上边的问题:
//实现上,可以用二元信号量,亦可以用计数信号量


signal_type kill_signal=0;

void signal_sender(void)
{
get_event(); //等待事件的发生,也可以用信号量

signal(kill_signal); //通知killer动手
}

void killer(void)
{

wait(kill_signal);//等待结束信号量
kill(thread1,...);
}

void threadn(void)
{
while(true)
{ do_anything_without_break();}
}

int main(void)
{
run_threads(kill_signal,killer,thread1, ...);
return 0;
}

lbaby 2003-08-08
  • 打赏
  • 举报
回复
我想这个问题的关建有两点:
1,可靠性
2,方便和经济性

进程间通信代价太高
但它是安全的,可以让主线程给各副线程发消息,
正如楼主所说的:生产者轮循式阻塞,发现要退出时唤醒消费者线程

全局变量显然没有这方面的负担,但在子进程的轮番查询上也不讨好

我想可以用一个信号处理这件事,没有经济上的负担,也不用怕不安全
如果怕信号不清晰,可以用管程来处理


sandrowjw 2003-08-07
  • 打赏
  • 举报
回复
用加循环锁的全局变量就足够了,效率也高。
step_by_step 2003-08-07
  • 打赏
  • 举报
回复
我在unix/linux下面一般使用信号量来实现多线程之间的互斥和同步的
pthread_mutex_ini()
pthread_mutex_lock()
pthread_mutex_unlock()
pthread_mutex_destroy()
warrenchou 2003-08-07
  • 打赏
  • 举报
回复
全局变量和event
suede001 2003-08-07
  • 打赏
  • 举报
回复
GZing
lizhongkun 2003-08-07
  • 打赏
  • 举报
回复
GZing
加载更多回复(13)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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