gpt4 book ai didi

c++ - std::signal 和 std::raise 线程安全吗?

转载 作者:IT老高 更新时间:2023-10-28 22:26:21 28 4
gpt4 key购买 nike

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com