问题标签 [sig-atomic-t]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 我可以使用 volatile sig_atomic_t 来避免 C++03 中的互斥锁吗?
如果我在具有原子读取和递增/递减支持的硬件上,我可以volatile sig_atomic_t
在 C++03 中使用 a 来访问原子操作并避免完全成熟的互斥锁,还是必须等待 C++11 和std::atomic<int>
?
c - C 在头文件中使 volatile sig_atomic_t 全局化
我正在尝试创建一个全局变量,在我的 msh.c 文件中初始化为:
仅此一项似乎还不错。但是,如果我转到我的 proto.h 文件(该文件包含在该项目的所有 c 文件中),然后键入:
它抛出了一堆错误:
我究竟如何使这个变量成为全局变量?谢谢。
c - 演示在信号处理过程中不使用 volatile 关键字时编译器的优化效果?
在下面的代码中,我没有使变量quit
has volatile sig_atomic_t
。我把它作为一个平原int
。
由于该quit
变量未指定为volatile
,因此我期望编译器的优化器会将while
代码中的 -loop 优化为:
但我不认为这会发生。在一个终端上,我运行以下命令。
在另一个终端上,我将 SIGUSR1 发送到我的程序。
在第一个终端上,输出显示程序的信号处理程序被调用并且while
-loop 退出。
quit
由于不存在,我如何证明循环的优化volatile
?
c - 在信号处理的上下文中,哪些变量需要是 sig_atomic_t ?
这是一个简单的玩具程序,它使用volatile sig_atomic_t
.
我想我知道为什么这个特定程序中的变量volatile sig_atomic_t
是必要的。quit
- 如果没有
volatile
,编译器可能会优化while (!quit) ;
为无限循环。它没有发现循环正在修改quit
,因此它假定quit
始终保持不变0
。 - 更新
quit
或读取quit
应该发生在单个机器指令中。如果更新或读取需要多条机器指令quit
,那么如果在更新进行时调用信号处理程序,则信号处理程序中的读取可能会在quit
.
到目前为止我是正确的吗?如果没有,请在您的回答中纠正我。
现在我想学习sig_atomic_t
在信号处理的上下文中何时需要的通用规则。Jonathan Leffler 在评论中解释说,提供一个概括并不容易。
您能否提供一个已知场景的列表,其中需要sig_atomic_t
从 C 标准的角度定义变量?它不必是详尽的清单。它可能是经验不足的开发人员在使用信号处理代码编写 C 软件时可以参考的列表。