问题描述
我想用Python重写这个非常简单的C ++代码。多亏了sig_atomic_t
,可以确保即使执行::signal_handler()
时调用if (::flag)
也不会发生数据争用。
#include <csignal>
#include <iostream>
#include <unistd.h>
namespace {
volatile sig_atomic_t flag = false;
void signal_handler(int) {
flag = true;
}
}
int main() {
while (true) {
if (::flag) {
break;
}
sleep(10);
}
}
这是我刚想到的Python等效项:
import signal
import time
#In Python 3.5 or higher,this is needed to make time.sleep() not sleep
# the remaining seconds after the signal handler is called.
class SleepInterruptException(Exception):
pass
flag: bool = False
def signal_handler(signal,frame) -> None:
global flag
flag = True
raise SleepInterruptException()
signal.signal(signal.SIGINT,signal_handler)
while (True):
if (flag):
break
try:
time.sleep(10)
except SleepInterruptException:
pass
但是此代码是否安全(就数据竞争而言)?如果没有,我该如何重现sig_atomic_t
的行为?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)