作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
C 和 C++ 标准支持信号的概念。但是,C11 标准规定函数 signal() 不能在多线程环境中调用,或者行为未定义。但我认为信号机制本质上是用于多线程环境的。
引用 C11 标准 7.14.1.1.7
"Use of this function in a multi-threaded program results in undefined behavior. The implementation shall behave as if no library function calls the signal function."
对此有何解释?
以下代码不言而喻。
#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();
}
最佳答案
But I think the signal mechanism is by nature for multi-threaded environments.
我认为这句话是核心误解。 signal()
是一种用于进程 间通信的方法,而不是用于线程间 的方法。线程共享公共(public)内存,因此可以通过互斥锁和控制结构进行通信。进程没有公共(public)内存,必须使用一些显式的通信结构,如 signal()
或文件系统。
关于c++ - std::signal 和 std::raise 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14613409/
我是一名优秀的程序员,十分优秀!