我从阅读这个 github issue 了解到,“旧的 LinuxThreads 库和新的 NPTL 库都以异步信号安全的方式实现了 trylock()”,但“MacOSX”却没有。为什么不或如何不?
pthread_mutex_trylock()
怎么可能不是信号安全的?
例如,如果我只想接收一次信号,然后忽略特定信号的后续信号,我想做类似的事情:
static pthread_mutex_t single_exit_signal_mutex = PTHREAD_MUTEX_INITIALIZER;
static void sig_quit(int sig) //registered for SIGQUIT, SIGTERM, SIGINT
{
// Only accept one SIGQUIT, SIGTERM, or SIGINT.
if (pthread_mutex_trylock(&single_exit_signal_mutex) != 0)
return;
//...other cleanup code
}
而且这在NPTL库下的Linux中似乎是“安全的”,但为什么在POSIX标准中却没有呢?
有没有另一种方法只处理一次信号?
你可以使用 atomic variable 而不是 mutex.