【问题标题】:Reading stdin from another thread从另一个线程读取标准输入
【发布时间】:2011-07-22 10:04:32
【问题描述】:

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

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

谢谢。

这是我从标准输入读取的部分

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;

}

【问题讨论】:

  • 您可能已经关闭了标准输入,但是如果没有看到代码示例就很难判断。
  • 我已经附上了上面的代码
  • 你是怎么关闭这个帖子的?
  • 如果设置了全局关闭标志,那么我只退出此函数并在最后一行返回 0 .. 或者如果我捕捉到 sigusr1 信号,我正在执行 pthread_exit()。
  • 如果在信号处理程序强制退出时线程在中间执行 getline(),那么流的状态可能会被搞砸(尤其是任何锁)。信号处理程序应该设置一些状态,允许线程在从信号处理程序返回后退出。如果线程在 getline() 中停止(等待用户输入),那么您可能不应该使用 getline()。查找选择()。这允许您以信号友好的方式停止等待流上的输入(C 流,但有标准输入)。

标签: c++ pthreads stdin getline


【解决方案1】:

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

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

你需要做的是:

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

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

【讨论】:

  • 嘿..谢谢伙计...你是对的我在退出线程时仍然连接到标准输入...
猜你喜欢
  • 1970-01-01
  • 2021-07-24
  • 2011-10-12
  • 2011-04-14
  • 2013-03-30
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多