C 我怎样才能有一个新的线程;“接管”;史坦?

C 我怎样才能有一个新的线程;“接管”;史坦?,c,io,stdin,C,Io,Stdin,在我正在编写的程序中,我有一个主线程,其中包含一个接受控制台输入的循环。但是,在某个时刻,会创建一个新线程,该线程也会尝试从stdin读取数据。有一个变量指示另一个线程已启动,但fgets仍在等待主线程中的输入,因此在新线程启动后输入的第一个控制台输入被主线程而不是新线程错误地读取 有办法解决这个问题吗 我尝试过的一件事是(在主线中): 但我似乎误解了流是如何工作的,因为其他fgets调用没有读取通过fputs写入的数据。创建一个布尔变量,并使用适当的同步原语进行保护。将其初始化为false。当

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

有办法解决这个问题吗

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


但我似乎误解了流是如何工作的,因为其他fgets调用没有读取通过fputs写入的数据。

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

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


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

对于后代,以下是我解决这个问题的方法

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

上面的代码片段变成:

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

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

为什么要这样做?您确定没有更好的设计可以将所有I/O保持在同一个线程上吗?这将是理想的。我想我很难看清森林里的树木。我试试看。谢谢你的意见!这在某种程度上肯定是有用的,但是对于这个程序,我已经进行了重构,只有一个线程处理stdin。
while(foo) {
   fgets(input,200,stdin);
   if(busy) {
      busyStuff(input);
   } else {
      nonBusyStuff(input);
   }
}