POSIX线程:最好的中断方法

时间:2017-06-28 18:12:25

标签: c linux gcc pthreads c11

当我开始使用pthreads时,我被告知的第一件事是 - 你应该避免强制线程取消,比如pthread_cancel。相反,我们应该通过线程通信通道使用线程取消通知。

如果我们在线程中运行了很长的任务,我们将此任务拆分为小块并在每个块处理后检查取消标记。像这样:

loop {
    process_chunk();
    if (check_cancel_flag())
        break;
}

但是实现这个check_cancel_flag()函数的最佳方法是什么?

凭借我在c和linux方面的所有经验,我只记得那些方法:

  1. (如果只有一个工作线程)您可以使用sig_atomic_t作为取消标志的类型。在check_cancel_flag()函数中检查它并在thread`信号处理程序中将其标记为true。然后从主线程中调用pthread_kill。

  2. 将任何POD类型用于取消标记并使用互斥锁进行保护。在这种情况下,您将经常调用锁定开销。

  3. 使用互斥锁作为取消标记。使用pthread_mutex_trylock调用检查它。如果主线程释放了此互斥锁,则需要关闭工作线程。

  4. (对于C11)使用gcc _atomic内置函数(或其他asm原子库)来设置和检查取消标记。

  5. 我什么都记错了。

    问题:如何选择正确的方法? 你知道关于这个问题的任何基准吗?

1 个答案:

答案 0 :(得分:2)

另一种方法是使用读写器锁(pthread_rwlock_t)来保护标志,因为你的工作线程需要经常读取它,但它只写一次。

只要在标志检查之间处理的块不是太小,开销就会微不足道。