pthread如何返回最快的结果并终止较慢的结果?

时间:2013-06-10 00:40:23

标签: c multithreading pthreads

我正在编写一个程序,主线程将创建三个子线程。这些线程同时运行,我想要做的是一旦子线程完成,我将检查输出是否正确。如果是,则终止另外两个线程;如果没有,那么扔掉这个线程的结果并等待其他两个线程的结果。

我正在使用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,整个程序就会终止,而不仅仅是一个线程。我不知道为什么。

我仍然不知道是否有其他方法来编写这个程序。谢谢你帮我解决了这个问题。

1 个答案:

答案 0 :(得分:5)

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

要终止线程,请使用pthread_cancel()。这通常会在下一个取消点终止线程。取消点列在pthread_cancel()的手册页中,只有write()sleep()pthread_testcancel()等特定功能才是取消点。

但是,如果将线程的可取消性类型(pthread_setcanceltype())设置为PTHREAD_CANCEL_ASYNCHRONOUS,则可以随时取消该线程。这可能是 DANGEROUS ,你必须非常小心。例如,如果您在malloc()通话中取消线程,您将在以后遇到各种令人讨厌的问题。

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

摘要

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

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

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