在信号处理函数中使用本地互斥锁来同步共享数据

时间:2016-10-18 21:55:07

标签: c++ linux multithreading signals posix

我在Linux OS上的应用程序中有4个pthread

SIGTERM在3个线程中被阻止,并且在信号处理函数中只有一个线程句柄。我认为下面的代码是安全的,因为互斥体是在信号处理函数中本地创建的,主要用于将对共享数据变量的更改推送到另一个需要基于此做某事的线程。

我的理解是否正确?

void sig_handler_sigterm()
{
    mutex * m = new mutex;
    mutex_lock(m);
    //update shared data, the change needs to reflect in another thread
    mutex_unlock(m)
    sleep(2);
    exit(1);
}

1 个答案:

答案 0 :(得分:0)

没有。首先,这不是互斥体的工作方式。两个线程必须共享一个互斥锁,两者都必须锁定它。所以它不能是局部变量。接下来的事情是从信号中仅调用标准库函数的subset of standard library functions子集是安全的。新内件可以使用的brk()不是其中之一。因此,在信号中分配内存不是一个好主意。

接下来的一点是,睡一秒并不能保证其他线程有足够的时间做他们需要做的事情。