【发布时间】:2019-03-10 19:55:50
【问题描述】:
我正在寻找一种能够在从网络接收数据的同时向终端输入数据的方法。
为此,我创建了一个新线程 dataCapture (std::thread),它将使用 std::cin 获取输入。主线程是接收者。
当网络发送字符串“end”时程序需要退出。
这是简化的代码:
void dataCapture()
while (! quit) {
std::string data;
std::cout << "Enter data: ";
std::cin >> data;
}
}
bool quit=false;
int main() {
// socket creation
// connection to server
const std::string quit_value = "end";
std::thread datacapture_T(dataCapture);
while (! quit) {
char recep[1024];
recv(sd, recep, sizeof(recep),0);
if (recep == quit_value) {
quit=true;
}
}
datacapture_T.join();
return 0;
}
这不起作用,因为在收到"end" 后,main 阻塞了 datacapture_T.join(),因为 dataCapture 在 std::cin 调用中被阻塞了。
是否可以从 main 解除阻塞 dataCapture 线程?
如果没有,是否可以强行杀死它?
ps:为了简化,我没有包括锁。
感谢您的帮助!
【问题讨论】:
-
尝试关闭
std::cin -
您可以将 quit 作为引用(必须在使用 std::ref 的线程中显式执行)传递给线程方法,然后当在主线程中更改时,它将生成线程方法退出。
-
@PaulSanders 我该怎么做对不起?你的意思是关闭 stdin 吗?如果是,程序实际上在加入后调用了另一个使用
std::cin的函数,那么我可以重新打开它吗? -
@RasmusDall 我不认为我理解你的想法对不起。问题是线程在
std::cin上被阻塞,而不是它无法检测到quit更改了值 -
cin不是为此而构建的。为了获得最佳结果,您必须使用允许终止或超时的系统特定调用。一个例子:stackoverflow.com/questions/18552029/…
标签: c++ multithreading pthreads