【问题标题】:outputting to cin from a worker thread (c++)从工作线程输出到 cin (c++)
【发布时间】:2010-01-15 14:58:31
【问题描述】:

我的程序有一个主线程,它接受用户的命令输入。另外,它可能会增加(至少 1 个)工作线程在后台搅动数据。

用户可以通过在控制台中输入命令来终止程序。然而,当数据搅动完成时,主线程仍然阻塞等待用户输入,因此程序不会终止。

我想知道的是如何将终止命令“q\n”从工作线程写入std::cin,以便阻塞命令输入线程(也是主线程)将终止。或者这会是一件坏事吗?我尝试了以下方法,但程序只是挂起或无法写入std::cin,不知道为什么。

static ACE_THR_FUNC_RETURN worker( void *p) {
 .....
    if (_this->m_num_threads_done == _this->m_threads.size()) {
        fputs("q\n", stdin);
    }

}

在主线程上,这是从 main 调用的:

void runEventLoop()
{
    printWelcomeMessage();

    char buffer[MAXC];
    while( !m_exitLoop )
    {
        std::cin.getline(buffer, MAXC);
        if( std::cin.eof() )
            break;
        handleCommand( buffer );
    }
}

有人可以就我在这里做错了什么提出建议,或者为我想要完成的工作提出更好的解决方案吗?

谢谢

【问题讨论】:

  • std::cin 是 c++ 中的 input 流。您可以从中读取,而不是写入。你能谈谈标准输出吗?
  • 在 unix 中,您可以将输出重定向到输入。所以以编程方式我认为你也应该能够做到这一点.. 但我说的是标准输入
  • 工作线程不应该做出关于程序流控制的决定,这应该由监听用户输入的主线程处理。如果您可以为您的主线程发布代码,那么我们可以建议一种更加模块化的方法
  • 您似乎在谈论连接到 std::cin 的伪终端。
  • Sam:发布主线程循环。我正在寻找的只是修改循环,以便主线程知道所有工作线程何时完成并且必须选择退出自身。所以我不必每次都坐在那里输入终止命令。

标签: c++ multithreading cin


【解决方案1】:

在 Unix 上,当您需要一个线程来等待多个事情(例如,std::in 上的一个字符和来自工作线程的命令来传达它正在关闭)时,您使用 select()...您可以使用 pipe() 系统调用创建一个管道,并且工作线程可以在它退出时写入它...当前在 cin 上等待的主线程可以在两者上调用 select() 来阻塞,然后对任何一个做出适当的反应当它醒来时..

在 Windows 上,您可能可以将 WaitForMultipleObjects() 用于相同目的。

【讨论】:

  • 你手边有任何示例代码或指向它们的指针吗?如果它有帮助,我正在使用一个名为 ACE 的网络包(但是一旦我明白了一般的想法,我应该很容易在 ACE 上搜索如何做到这一点)
【解决方案2】:

一个“不错”的解决方案是编写自己的输入函数,即非阻塞并检查是否按下了字符,否则空闲。在该循环中,您可以进行终止检查。

了解non-blocking keyboard input。

除此之外,还有几种依赖于平台的解决方案,具体取决于您的线程库和操作系统。如果您想用该信息扩展您的问题,我们可以提出一些建议。

【讨论】:

  • 理想情况下,我希望解决方案跨平台。但我在 mac os x snow leopard 上使用 pthreads
猜你喜欢
  • 2012-12-10
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 2022-06-27
相关资源
最近更新 更多