等待用户IO的c ++线程('getchar()')在主进程中挂起'Py_Initialize()'

时间:2012-12-22 20:31:02

标签: c++ python multithreading

我偶然发现了一个非常奇怪的问题。在我的代码中,我有一个线程启动等待用户输入---如果用户想要中断主进程。在该线程开始之后,我尝试使用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()替换sleep(10) while循环,Py_Initialize()返回正常,一切都很好。为什么IO请求阻止Py_Initialize()

谢谢!

1 个答案:

答案 0 :(得分:1)

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