在多线程程序中退出程序

3

我正在编写一个使用POSIX线程库的程序。我正在执行一些系统调用的返回值,例如:

if (pthread_join(temp, NULL) != 0) {  
    cerr << "system error\n" << endl;  
    exit(1);  
}  

我希望程序在满足if条件时立即退出,但是当cpu决定在“exit(1)”命令之前切换到不同的线程时可能会出问题。
有没有一种方法来解决这种情况?

使用特殊的互斥锁并不能帮助,因为: 1. 我有许多类似的调用,每个调用都要锁定,这会使代码非常缓慢,低效,并且大多数情况下会很难看! 2. 每个互斥锁都需要其自己的返回值检查!显然,这并不能解决最初的问题。。。
有没有帮助的想法?


2
已为您格式化了代码。请在以后抽出时间自行完成此操作。这只花费了我大约3秒钟的时间。 - John Dibling
你能解释一下竞态条件吗?我在这里看不出有什么问题。即使内核切换了,它也会回来,程序最终会退出。这是某种非常易变或时间敏感的东西吗? - Chris Eberle
@Jenna,请解释一下为什么需要防止潜在的上下文切换。 - NPE
@JohnDibling:将来请多花三秒钟时间,认真做好。 - Lightness Races in Orbit
@Jenna:你最好努力避免那些在程序一开始就会破坏稳定性的问题,而不是把注意力放在事后如何干净地终止上。 - NPE
显示剩余2条评论
2个回答

1

使用GCC 原子操作 来写入一个常用变量。每个线程应该定期检查这个变量。如果这个变量被改变,就退出线程。当所有其他线程都完成时,主线程退出。

再来一个链接。


问题在于调度程序可能会将我带到不同线程的任何代码中,因此我不能在每行代码之前仅仅检查这个变量。 - Zach
@Jenna:在这种情况下,使用原子操作更改公共值,并使用pthread_exit作为所有退出点。策略是相同的:如果标记变量不为空,则所有其他线程应以相同的方式退出。如果所有线程都退出,则应用程序也会退出。 - Naszta
你甚至不需要使用原子操作,使用一个普通的全局变量也可以达到同样的效果。原子性只在并发情况下才重要,在这种情况下没有并发。偶尔检查全局变量(例如,在工作线程中,在从队列中拉取任务之前每次检查)通常是完全可以的。如果这还不够好,您仍然可以为每个线程安装信号处理程序,并使用 pthread_kill 向每个线程发送信号(最好不要使用 SIGTERM,因为它会终止整个进程)。 - Damon

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接