C++ 中的线程消除

Pthread Cancellation in c++

本文关键字:线程 C++      更新时间:2023-10-16

以下(伪)代码引起了一些我不理解的行为。我有 2 个线程并行运行。两者都做相同的(复杂)计算,但我不知道哪个会先完成。反复运行,在某些情况下,第一个更快,第二个更快。这没关系,可以按预期工作。然后,第一个成功的线程应该终止另一个线程,并且两个线程应该一起分叉。但是,如果第一个求解器完成,则一切正常,但如果第二个求解器首先完成,则"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);
}

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

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

  • 信号模板 ( pthread_signmask
  • 浮点环境 ( fenv
  • 能力
  • CPU 关联掩码 ( sched_setaffinity

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

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

不要使用

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