从另一个线程读取stdin

时间:2011-03-24 19:27:31

标签: c++ pthreads stdin getline

我在unix上的代码中使用了p_threads。在我的主程序中,我有一个线程节点,它创建了2个线程,其中一个线程使用getline从标准输入读取。所有这一切都很好。 除了在我的代码中的某些时候,我必须“重新启动从标准输入读取的线程”。当我这样做时,我无法从标准输入中读取任何内容。

任何建议我可能做错了??? /

感谢。

这是我从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;

}

1 个答案:

答案 0 :(得分:4)

您可能正在中止仍然连接到标准输入的线程,请记住您在执行getline时中止了线程。

现在我不知道是否有办法获取标准输入指针并释放它以获得更多行但是可能有一种方法可以继续读取前一个线程已读取的行。

您需要做的是:

  • 进入getline时使用共享标志并将其设置为true
  • 将您读取的变量设置为静态变量,并且除了需要重新启动的线程外,不要在任何线程中使用getline
  • 当你重建新线程时,如果输入getline的标志为真,则不要调用getline
  • 完成行重置布尔标志后,
  • 使用锁定来防止读取行标志上的并发访问

当您需要该值时,只需使用您用于传递给getline的静态变量。