以下(伪)代码引发了一些我不理解的行为。我有两个并行运行的线程。两者都进行相同(复杂)的计算,但我不知道哪个会先完成。反复运行,有些情况下第一个更快,第二个更快的情况。这没关系,按预期工作。然后,第一个成功的线程应该终止另一个线程,两者都应该一起分叉。但是,如果第一个求解器完成,则一切正常,但如果第二个求解器首先完成,则“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。如果伪代码不够详细,请告诉我。
答案 0 :(得分:1)
不要使用pthread_cancel
- 使用全局状态,并在每个线程的“主循环”中进行检查。在线程函数退出之前将其设置为“on”。
答案 1 :(得分:1)
基于伪代码,一个问题可能是线程具有延迟取消(默认值)而不是异步取消。如果取消的线程永远不会达到cancellation point,则pthread_join
将阻止。调用pthread_create
时,新创建的线程继承调用线程的:
pthread_signmask
)fenv
)sched_setaffinity
)尝试从您要取消的主题中调用pthread_setcanceltype
。您可能还需要考虑将调试器附加到程序以识别线程的当前状态。
理想情况下,如果可能的话,请考虑避免pthread_cancel
。尽管记录了pthread调用,但由于所有细微的细节,很难获得并保持确切的行为。通常更容易设置一个标志,指示线程设置为退出,并在设置时从函数开始返回。在do_some_complex_task
中,考虑将复杂任务分解为较小的任务,并检查每个较小任务之间的取消。