从另一个线程读取标准输入流

3
我在Unix上的代码中使用了p_threads。在我的主程序中,我有一个线程Node,它创建了两个线程,其中一个使用getline从标准输入读取数据。这一切都正常工作。但是,在我的代码的某个时候,我需要“重新启动从标准输入读取数据的线程”。当我这样做时,我无法从stdin读取任何内容。
请问我可能做错了什么?有什么建议吗?
谢谢。
以下是我从stdin读取数据的部分。
void* parseCmd(void* s) 
{

    sigset_t new2; 
    struct sigaction act; 
    sigemptyset(&new2); 
    sigaddset(&new2,SIGINT); 
    pthread_sigmask(SIG_UNBLOCK, &new2, NULL); 

    act.sa_handler = interrupt; 
    sigaction(SIGINT, &act, NULL); 
    signal(SIGUSR1, signal_Handler);

    std::string input("");
    while (1) 
    {

       std::cout << "SERVANT > ";
       std::getline(std::cin, input);

       doTheWork(input);
       cin.clear();

       std::cout << std::endl;

      if(global_shutdown==1 || auto_global_shutdown==1)
        break;
    }


    cout<<"cmd thread exit.Main\n"; 
    return 0;

}

3
如果没有看到代码示例,很难确定您是否关闭了标准输入。 - Fred Foo
我已经在上面附上了代码。 - Teotia
你是如何关闭这个线程的? - Martin York
如果全局关闭标志已设置,则仅在此函数中退出并返回0作为最后一行。或者,如果捕获到SIGUSR1信号,则会执行pthread_exit()。 - Teotia
如果线程在执行getline()时,信号处理程序强制退出,则流的状态可能会被搞乱(尤其是任何锁定)。信号处理程序应设置一些状态,使线程能够在从信号处理程序返回后退出。如果线程在getline()中停顿(等待用户输入),则您可能不应使用getline()。查找select()。这允许您以信号友好的方式停止等待流上的输入(C流,但标准输入在那里)。 - Martin York
1个回答

4
您可能正在终止仍连接到标准输入的线程,记住您在执行getline时中止了该线程。
现在我不知道是否有一种方法可以获取标准输入指针并释放它以能够获取更多行,但可能有一种方法可以继续读取先前线程已经读取的行。
你需要做的是:
  • 在进入getline时使用共享标志并将其设置为true
  • 将变量设置为静态变量,并且除了需要重新启动的线程之外,在任何线程上都不要使用getline。
  • 在重建新线程时,如果进入getline的标志为真,则不要调用getline
  • 在完成获取行后重置布尔标志
  • 使用锁定来防止对读取行标志的并发访问
当您需要该值时,只需使用您用于传递给getline的静态变量即可。

1
嘿,谢谢啊...你说得对,我在仍然连接到标准输入时退出了线程... - Teotia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接