我正在编写一个程序,主线程将创建三个子线程。这些线程同时运行,我想要做的是一旦子线程完成,我将检查输出是否正确。如果是,则终止另外两个线程;如果没有,那么扔掉这个线程的结果并等待其他两个线程的结果。
我正在使用pthread_create在main函数中创建三个结果。但我不知道如何使用join函数。如果我在main函数中使用join函数三次,它只是一个接一个地等待,直到三个线程完成。
我的计划是这样的:
int return_value;
main(){
pthread_create(&pid[0], NULL, fun0, NULL);
pthread_create(&pid[1], NULL, fun1, NULL);
pthread_create(&pid[2], NULL, fun2, NULL);
}
fun0(){
...
if( check the result is right ){
return_value = result;
if (pid[1] is running) pthread_kill( pid[1], SIGTERM );
if (pid[2] is running) pthread_kill( pid[2], SIGTERM );
}
fun1() ...
fun2() ...
函数0,1和2彼此相似,一旦一个函数有正确的答案,它将杀死另外两个线程。但是,在运行程序时,一旦处理了pthread_kill,整个程序就会终止,而不仅仅是一个线程。我不知道为什么。
我仍然不知道是否有其他方法来编写这个程序。谢谢你帮我解决了这个问题。
答案 0 :(得分:5)
pthread_kill()
函数不是为终止线程而设计的,就像kill()
不是为了终止进程而设计的。这些功能只是发送信号,它们的名字是不幸的历史副产品。某些信号处理程序将导致进程终止。使用pthread_kill()
允许您选择处理信号的线程,但信号处理程序仍将执行完全相同的操作(例如,终止进程)。
要终止线程,请使用pthread_cancel()
。这通常会在下一个取消点终止线程。取消点列在pthread_cancel()
的手册页中,只有write()
,sleep()
,pthread_testcancel()
等特定功能才是取消点。
但是,如果将线程的可取消性类型(pthread_setcanceltype()
)设置为PTHREAD_CANCEL_ASYNCHRONOUS
,则可以随时取消该线程。这可能是 DANGEROUS ,你必须非常小心。例如,如果您在malloc()
通话中取消线程,您将在以后遇到各种令人讨厌的问题。
您可能会发现,不时地测试共享变量要容易得多,或者甚至可能使用不同的进程,如果不再需要它们,则只需kill()
。取消一个帖子很棘手。
最简单的选择是在每个线程中测试一个变量,看它是否应该被取消。
如果这不起作用,我的下一个建议是使用fork()
代替pthread_create()
,之后您可以使用kill()
。
如果您想玩火,请使用异步pthread_cancel()
。这可能会在你脸上爆炸。您将不得不花费数小时的宝贵时间来寻找错误,并试图弄清楚如何正确地进行清理。你会失眠,你的猫会因疏忽而死。