在 C++11 中,给定一种请求循环(作为 Web 请求循环的一部分),在捕获的信号上执行不安全代码的最安全(并且最好是最有效)的方法是什么?例如,在从 linux 命令行捕获 SIGUSR1 时:kill -30 <process pid>
在下一个触发请求时运行“不安全代码”是可以接受的,如果在运行不安全代码之前多次触发信号,则不会丢失任何信息。
例如,我当前的代码是:
static bool globalFlag = false;
void signalHandler(int sig_num, siginfo_t * info, void * context) {
globalFlag = true;
}
void doUnsafeThings() {
// thigns like std::vector push_back, new char[1024], set global vars, etc.
}
void doRegularThings() {
// read filesystem, read global variables, etc.
}
void main(void) {
// set up signal handler (for SIGUSR1) ...
struct sigaction sigact;
sigact.sa_sigaction = onSyncSignal;
sigact.sa_flags = SA_RESTART | SA_SIGINFO;
sigaction(SIGUSR1, &sigact, (struct sigaction *)NULL);
// main loop ...
while(acceptMoreRequests()) { // blocks until new request received
if (globalFlag) {
globalFlag = false;
doUnsafeThings();
}
doRegularThings();
}
}
我知道在主循环测试+设置 globalFlag 布尔值时可能存在问题。
编辑:if (globalFlag)
测试将在一个相当紧凑的循环中运行,“偶尔”的假阴性是可以接受的。但是,我怀疑 Basile Starynkevitch 的解决方案没有任何优化?