我偶然发现了一个非常奇怪的问题。在我的代码中,我有一个线程启动等待用户输入---如果用户想要中断主进程。在该线程开始之后,我尝试使用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()
?
谢谢!
答案 0 :(得分:1)
当您调用getchar
之类的I / O函数时,您会锁定某个I / O对象,直到该函数终止。在多线程程序中无限期地保持锁定是非常糟糕的形式,因为这将导致尝试获取该锁定的任何线程无限期地阻塞。不要在多线程程序中调用阻塞I / O函数。