gpt4 book ai didi

c++ - C++中的Pthread取消

转载 作者:行者123 更新时间:2023-11-28 03:34:44 26 4
gpt4 key购买 nike

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

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);
}

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

最佳答案

根据伪代码,一个问题可能是线程有延迟取消(默认值)而不是异步取消。如果取消的线程永远不会到达 cancellation point ,那么 pthread_join 就会阻塞。调用pthread_create时,新创建的线程继承了调用线程的:

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

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

关于c++ - C++中的Pthread取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11310644/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com