0

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

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。如果伪代码不够详细,请告诉我。

4

2 回答 2

1

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

于 2012-07-03T12:15:25.983 回答
1

根据伪代码,一个问题可能是线程具有延迟取消(默认值)而不是异步取消。如果被取消的线程从未到达取消点pthread_join则将阻塞。调用pthread_create时,新创建的线程继承调用线程的:

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

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

于 2012-07-03T14:26:57.543 回答