当我开始使用pthreads时,我被告知的第一件事是 - 你应该避免强制线程取消,比如pthread_cancel。相反,我们应该通过线程通信通道使用线程取消通知。
如果我们在线程中运行了很长的任务,我们将此任务拆分为小块并在每个块处理后检查取消标记。像这样:
loop {
process_chunk();
if (check_cancel_flag())
break;
}
但是实现这个check_cancel_flag()函数的最佳方法是什么?
凭借我在c和linux方面的所有经验,我只记得那些方法:
(如果只有一个工作线程)您可以使用sig_atomic_t作为取消标志的类型。在check_cancel_flag()函数中检查它并在thread`信号处理程序中将其标记为true。然后从主线程中调用pthread_kill。
将任何POD类型用于取消标记并使用互斥锁进行保护。在这种情况下,您将经常调用锁定开销。
使用互斥锁作为取消标记。使用pthread_mutex_trylock调用检查它。如果主线程释放了此互斥锁,则需要关闭工作线程。
(对于C11)使用gcc _atomic内置函数(或其他asm原子库)来设置和检查取消标记。
我什么都记错了。
问题:如何选择正确的方法? 你知道关于这个问题的任何基准吗?
答案 0 :(得分:2)
另一种方法是使用读写器锁(pthread_rwlock_t
)来保护标志,因为你的工作线程需要经常读取它,但它只写一次。
只要在标志检查之间处理的块不是太小,开销就会微不足道。