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 (将#修改为@)