我的程序有一个主线程,接受用户的命令输入。另外,它有可能在后台搅动数据时增加(至少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 );
}
}
有人可以建议我在这里做错什么吗,否则建议为我要完成的事情提供更好的解决方案?
谢谢
最佳答案
在Unix上,当您需要一个线程来等待多件事(例如,std::in上的字符以及来自工作线程的命令来传达它正在关闭)时,可以使用select()...您可以创建带有pipe()系统调用的管道,并且工作线程可以在退出时向其写入...当前在cin上等待的主线程可以在两者上调用select()进行阻塞,然后在唤醒时对其中任何一个做出适当的 react 向上..
在Windows上,您可以出于相同的目的使用WaitForMultipleObjects()。