C ++中的Pthread取消

时间:2012-07-03 12:11:42

标签: c++ pthreads

以下(伪)代码引发了一些我不理解的行为。我有两个并行运行的线程。两者都进行相同(复杂)的计算,但我不知道哪个会先完成。反复运行,有些情况下第一个更快,第二个更快的情况。这没关系,按预期工作。然后,第一个成功的线程应该终止另一个线程,两者都应该一起分叉。但是,如果第一个求解器完成,则一切正常,但如果第二个求解器首先完成,则“join命令”无法识别第一个求解器终止(因此连接等待永远,程序不会继续)。我做错了什么或者我能做些什么不同的任何想法?

void* thread_function(...)
{
   do_some_complex_task();
   if (successfull && first_finsihed)
   {
        pthread_chancel(other_thread);
   }
}

int main()
{
    std::vector<pthread_t*> store;
    store.resize(2);

    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);

    pthread_create(store[0], NULL, thread_function, ...);
    pthread_create(store[1], NULL, thread_function, ...);

    pthread_join(*store[0], NULL);
    pthread_join(*store[1], NULL);
}

PS。如果伪代码不够详细,请告诉我。

2 个答案:

答案 0 :(得分:1)

不要使用pthread_cancel - 使用全局状态,并在每个线程的“主循环”中进行检查。在线程函数退出之前将其设置为“on”。

答案 1 :(得分:1)

基于伪代码,一个问题可能是线程具有延迟取消(默认值)而不是异步取消。如果取消的线程永远不会达到cancellation point,则pthread_join将阻止。调用pthread_create时,新创建的线程继承调用线程的:

尝试从您要取消的主题中调用pthread_setcanceltype。您可能还需要考虑将调试器附加到程序以识别线程的当前状态。

理想情况下,如果可能的话,请考虑避免pthread_cancel。尽管记录了pthread调用,但由于所有细微的细节,很难获得并保持确切的行为。通常更容易设置一个标志,指示线程设置为退出,并在设置时从函数开始返回。在do_some_complex_task中,考虑将复杂任务分解为较小的任务,并检查每个较小任务之间的取消。