1

我目前正在编写一个程序,主线程将创建三个子线程。这些线程同时运行,我想要做的是一旦一个子线程完成,我会检查输出是否正确。如果是,则终止其他两个线程;如果不是,则丢弃该线程的结果并等待其他两个线程的结果。

我正在使用 pthread_create 在主函数中创建三个结果。但我不知道如何使用连接功能。如果我在 main 函数中使用了 3 次 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,整个程序就终止了,而不仅仅是一个线程。我不知道为什么。

而且我仍然不知道是否还有其他方法可以编写此程序。谢谢你帮我解决这个问题。

4

1 回答 1

5

pthread_kill()函数不是为终止线程而设计的,就像kill()不是为终止进程而设计的一样。这些函数只是发送信号,它们的名字是不幸的历史副产品。某些信号处理程序会导致进程终止。Usingpthread_kill()允许您选择哪个线程处理信号,但信号处理程序仍将执行完全相同的操作(例如,终止进程)。

要终止线程,请使用pthread_cancel(). 这通常会在下一个取消点终止线程。取消点在手册页中列出pthread_cancel(),只有某些功能,如write()sleep()pthread_testcancel()是取消点。

但是,如果将线程的可取消类型(带pthread_setcanceltype())设置为PTHREAD_CANCEL_ASYNCHRONOUS,则可以随时取消线程。这可能很危险,您必须非常小心。例如,如果您在malloc()调用过程中取消了一个线程,那么您以后会遇到各种令人讨厌的问题。

您可能会发现时不时地测试共享变量要容易得多,或者甚至可以使用不同的进程,只要kill()您不再需要它们就可以了。取消线程很棘手。

概括

  1. 最简单的选择是在每个线程中测试一个变量,看看它是否应该被取消。

  2. 如果这不起作用,我的下一个建议是使用fork()而不是pthread_create(),之后您可以使用kill().

  3. 如果您想玩火,请使用 asynchronous pthread_cancel()。这可能会在你的脸上爆炸。您将不得不花费数小时的宝贵时间来寻找错误并试图弄清楚如何正确地进行清理。你会失眠,你的猫会因为忽视而死。

于 2013-06-10T00:51:10.380 回答