我怎样才能有一个新线程“接管”标准输入?

时间:2011-10-18 21:08:21

标签: c io stdin

在我写的程序中,我有一个主线程,其中包含一个接受控制台输入的循环。但是,在某些时候,会创建一个新线程,它也尝试从stdin读取。有一个变量指示此其他线程已启动,但fgets仍在等待主线程中的输入,因此在新线程启动后输入的第一个控制台输入被主线程而不是新线程错误地读取。 / p>

有什么方法可以解决这个问题吗?

我尝试过的一件事是(在主线程中):

while(foo) {
   if(busy) continue;
   fgets(input,200,stdin);
   if(busy) {
      fputs(input,stdin);
   } else {
      // do whatever was supposed to be done with input intended for main thread
   }
}

但我似乎对流的工作方式存在误解,因为其他fgets调用不会读取通过fputs写入的数据。

2 个答案:

答案 0 :(得分:1)

创建一个布尔变量,保护适当的同步原语。将其初始化为false。当线程需要向用户询问问题并获得答案时,请等待变量变为“false”(适用于您选择的同步原语),然后将其设置为true。完成所有输出并获得所需的所有输入。然后将变量设置为'false'并取消阻塞任何等待的线程(适用于您选择的同步原语)。

对于pthread,互斥和条件变量可能是最好的。对于Windows,关键部分和自动重置事件可能是最好的。

您的问题确实缺少一些可能暗示不同答案的细节。当用户无法确定哪两个单独的代码路径将获得他输入的输入时,用户应该如何与程序进行交互?如果他输入某些内容然后点击“输入”,那么它所代表的代码路径似乎取决于他是否在另一个线程准备就绪之前点击“输入”,这似乎是一个无法使用的程序。在几乎所有实际情况中,您都需要提示用户,然后等待响应,然后一起释放输入和输出。

答案 1 :(得分:0)

对后人来说,这就是我解决这个问题的方法。

我现在只有一个线程等待输入并将该输入的处理委托给特定于程序状态的函数,而不是让两个线程都在等待控制台输入。

上面的代码段变为:

while(foo) {
   fgets(input,200,stdin);
   if(busy) {
      busyStuff(input);
   } else {
      nonBusyStuff(input);
   }
}

并且没有创建具有fgets调用的其他pthread。