c++ - 在 std::cin 上发送输入
问题描述
我正在运行一个带有主线程和辅助线程的程序,并且在满足某个代码后,两者都应该退出。问题是辅助线程,在检查运行条件仍然有效后,使用 std::cin 等待用户输入,因此如果在调用 std::cin 之后满足条件,则线程继续等待用户输入。代码是这样的:
MainThread()
{
std::thread t1{DoOtherWork}
...
while(condition)
{
DoWork();
}
t1.join();
}
DoOtherWork()
{
while(condition)
{
char c;
std::cin >> c;
ProcessInput(c);
}
return;
}
因此,当不再满足条件时,两者都应该退出,但程序会一直等待用户输入。如果我只是输入任何随机字符并按回车键,程序就会正常退出。
我的问题是,在加入辅助线程之前,是否有任何方法可以从主线程向 std::cin 发送一些输入,以便另一个线程将继续执行并退出,而无需任何进一步的用户输入。提前致谢
解决方案
这是一个跨平台的解决方案:
诀窍是创建第三个线程,其唯一的工作就是接收输入。一旦处理,输入就会被记录下来。第二个线程可以使用互斥体以任何所需的时间间隔异步访问这些记录。这消除了线程的阻塞性质,std::cin
并允许您随时终止线程。
在 Windows 上,您可以CreateThread
使用std::thread
. 它返回一个句柄,您可以使用该句柄TerminateThread
在任何时候终止给定线程。
推荐阅读
- python - python - 如何在Python中给定范围内的宽词空间?
- php - 模型访问器属性返回相关模型
- database - 在 Tableau 中删除重复项
- java - 如何将多个资产放入 Android 开发的数据事件中
- javascript - 将参数传递给 Node.js 中的导入函数
- python - 列操作 R
- python - 如何使用 lambda 实现计数器?
- java - 我在自定义视图中做错了什么导致它无法在我的可扩展列表视图中呈现(其他视图呈现正常) - Android
- php - 在 Woocommerce 单一产品页面上显示 dokan 供应商名称
- sql - SQL 事件行到列时间戳