【发布时间】:2012-12-22 20:31:01
【问题描述】:
我刚刚偶然发现了一个非常奇怪的问题。在我的代码中,我启动了一个线程来等待用户输入——以防用户想要中断主进程。在该线程运行之后,我尝试使用 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;
}
如果我用sleep(10) 替换getchar() while 循环,Py_Initialize() 返回正常,一切正常。为什么IO请求阻塞Py_Initialize()?
谢谢!
【问题讨论】:
-
可能不相关,但理论上你需要用
bool volatile stopper = false;声明“stopper”变量。否则C++编译器有权认为while(!stopper) { }循环是一个无限循环,如果循环中没有代码可以改变stopper的值(即如果它只能从另一个线程并行改变)。 -
@MatsPetersson,我说去掉
getChar()就可以了。 -
那么 getChar() 有什么作用呢?我认为它与 getchar() 不同?
-
不,抱歉,肯定只是
getchar()--- 我的错误 -
@ArminRigo 这是一个有趣的观点,我不知道
volatile。谢谢。
标签: c++ python multithreading