1

我只是偶然发现了一个非常奇怪的问题。在我的代码中,我启动了一个线程来等待用户输入——以防用户想要中断主进程。在该线程运行之后,我尝试使用 python 进行一些计算。getchar()线程使用-- 如果输入是返回来查找用户输入,则设置一个布尔标志以使主进程停止执行其正在执行的操作。主进程每隔一段时间检查一次这个标志,如果它被设置,它会采取适当的行动。

示意图:

bool volatile stopper = false;
thread stopThread(interrupt, &stopper);
while( !stopper ) {
    /* ... stuff ... */
    Py_Initialize();                            // this doesn't return unless 'interrupt()' completes.
    /* ... do things with python object ... */
} 

中断方法看起来像,

void interrupt(bool *st) {
    char ch;   
    while( ch != '\n' ) {
        ch = getchar();
    }
    *st = true;
}

如果我getchar()用 a 替换 while 循环sleep(10),则Py_Initialize()返回正常,并且一切正常。为什么 IO 请求阻塞Py_Initialize()

谢谢!

4

1 回答 1

1

当你调用一个 I/O 函数getchar时,你会在某个 I/O 对象上持有一个锁,直到函数终止。在多线程程序中无限期地持有锁是非常糟糕的形式,因为这将导致任何试图获取该锁的线程无限期地阻塞。不要在多线程程序中调用阻塞 I/O 函数。

于 2012-12-23T00:41:51.373 回答