3

我的程序有一个主线程,它接受用户的命令输入。另外,它可能会增加(至少 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 );
    }
}

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

谢谢

4

2 回答 2

3

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

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

于 2010-01-15T15:07:37.723 回答
2

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

阅读有关非阻塞键盘输入的信息。

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

于 2010-01-15T15:02:31.870 回答