【发布时间】: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