如何解决Python中的sig_atomic_t等值是什么?
我想用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 举报,一经查实,本站将立刻删除。