微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python中的sig_atomic_t等值是什么?

如何解决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 举报,一经查实,本站将立刻删除。