是std :: signal和std :: raise线程安全吗?

xml*_*lmx 15 c c++ multithreading signals c++11

C和C++标准支持信号的概念.但是,C11标准表示无法在多线程环境中调用函数signal(),或者行为未定义.但我认为信号机制本质上适用于多线程环境.

引用C11标准7.14.1.1.7

"在多线程程序中使用此函数会导致未定义的行为.实现的行为就像没有库函数调用信号函数一样."

对此有何解释?

以下代码不言而喻.

#include <thread>
#include <csignal>

using namespace std;

void SignalHandler(int)
{
    // Which thread context here?
}

void f()
{
    //
    // Running in another thread context.
    //
    raise(SIGINT); // Is this call safe?
}

int main()
{
    //
    // Register the signal handler in main thread context.
    //
    signal(SIGINT, SignalHandler);

    thread(f).join();
}
Run Code Online (Sandbox Code Playgroud)

thi*_*ton 16

但我认为信号机制本质上适用于多线程环境.

我认为这句话是中心的误解.signal()是一种进程间通信的方法,而不是用于跨线程的方法.线程共享公共内存,因此可以通过互斥锁和控制结构进行通信.进程没有公共内存,必须使用某些显式通信结构signal()或文件系统.

  • @xmllmx C中定义的信号对任何事情都不是特别有用.它需要额外的实现定义保证,例如可以在处理程序中调用某些库函数,以使它们有用.Windows不支持太多(如果有的话)超出标准要求的范围.相反,Windows拥有自己的平台特定的进程间通信方法.对于线程间通信,Windows上支持C++ 11线程库,因此您可以编写用于线程间通信的可移植的标准符合代码. (6认同)