C POSIX线程:最佳中断方法

C POSIX线程:最佳中断方法,c,linux,gcc,pthreads,c11,C,Linux,Gcc,Pthreads,C11,当我开始使用pthreads时,我被告知的第一件事是——应该避免强制线程取消,比如pthread_cancel。相反,我们应该通过线程通信通道使用线程取消通知 如果我们有一个很长的任务要在线程中运行,我们会将这个任务分成小块,并在每个块处理之后检查取消标志。像这样: loop { process_chunk(); if (check_cancel_flag()) break; } 但是,实现这个check\u cancel\u flag()函数的最佳方法是什么

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

如果我们有一个很长的任务要在线程中运行,我们会将这个任务分成小块,并在每个块处理之后检查取消标志。像这样:

loop {
    process_chunk();
    if (check_cancel_flag())
        break;
}
但是,实现这个check\u cancel\u flag()函数的最佳方法是什么

根据我在c和linux方面的所有经验,我只记得这些方法:

  • (如果只有一个工作线程)可以使用sig_atomic_t作为取消标志的类型。在Check_cancel_flag()函数中选中它,并在线程信号处理程序中将其标记为true。然后从主线程调用pthread_kill

  • 对取消标志使用任何POD类型,并使用互斥锁对其进行保护。在这种情况下,过于频繁地调用lock会增加开销

  • 使用互斥作为取消标志。使用pthread\u mutex\u trylock调用检查它。如果主线程释放了这个互斥锁,那么就应该关闭工作线程

  • (对于C11)使用gcc_原子内置函数(或其他asm原子库)设置和检查取消标志

  • 我什么都不记得了

    问题是:如何选择正确的方法?
    您知道这个问题的基准点吗?

    另一种方法是使用读写器锁(
    pthread\u rwlock\u t
    )来保护该标志,因为您的工作线程需要经常读取它,但它只写入一次


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

    有一个确切的问题需要讨论。我认为这有点不同,只是为了消费者/生产者实现。事实上,我使用了队列和等待条件,但是如何中断长任务呢?顺便说一句,C11对数据类型有一个简单的
    \u原子
    限定<代码>sig_atomic_t永远都不合适,它唯一的保证是关于信号处理程序的,在那里它只保证不可分割性,而不是您想要的其他内存一致性属性。我在C11中写过关于原子的内容。当我们有单个工作线程时,我应该使用sig_atomic_t,并且只在当前线程的信号处理程序中编辑它