【发布时间】:2015-04-17 19:53:33
【问题描述】:
考虑以下代码:
#include <stdlib.h>
#include <signal.h>
#include <stdint.h>
#include <stdio.h>
uint64_t counter = 0;
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
void sig_handler(int signo) {
printf( "%" PRIu64 "\n", counter);
}
int main() {
struct sigaction act;
act.sa_handler = &sig_handler;
sigaction(SIGINT, &act, NULL);
for( ;; ) {
counter++;
}
return 0;
}
如果我使用-O0 编译代码,我可以看到当我按下 CTR+C 时计数器会增加。使用-O1,这已被优化掉。为什么会这样?我该如何避免?
【问题讨论】:
-
哎呀,我忘了加
volatile。 -
在信号处理程序中,您只能访问类型为
volatile sig_atomic_t(或C++11 中std::atomic类型之一)的共享变量。 -
对于投票关闭 b/c 的人是不可复制的,确实可以see it live here。
-
另外,由于 C++14 中的易失性变化不再是有效的解决方案
标签: c++ gcc optimization