我有一个应用程序,它使用getline()在一个线程中从标准输入读取数据。我想要在主线程关闭应用程序,而getline仍然阻塞另一个线程。如何实现这一点?
我不想强制用户按ctrl-Z关闭stdin和应用程序。
到目前为止,我已经尝试过我的编译器设置(RuntimeLibrary=/MT)在Windows 8.1 64位、v120平台工具集上:
- freopen stdin,但被内部锁定阻止 - 销毁调用abort()的线程 - putback一个Eof、行结束符到std::cin,也被阻塞
* 更新 *
- detach()不起作用,exit()被锁定 - winapi TerminatThread()调用abort() - winapi CloseHandle(GetStdHandle(STD_INPUT_HANDLE))挂起 - 调用TerminateProcess() - 可以工作,但我希望优雅地退出
* 更新2:解决方案 *
- WriteConsoleInput()可以使std::getline()从阻塞读取中返回。这适用于任何msvc运行时库。有关工作解决方案的代码,请参见接受的答案。
下面是示例代码,显示了问题:
我不想强制用户按ctrl-Z关闭stdin和应用程序。
到目前为止,我已经尝试过我的编译器设置(RuntimeLibrary=/MT)在Windows 8.1 64位、v120平台工具集上:
- freopen stdin,但被内部锁定阻止 - 销毁调用abort()的线程 - putback一个Eof、行结束符到std::cin,也被阻塞
* 更新 *
- detach()不起作用,exit()被锁定 - winapi TerminatThread()调用abort() - winapi CloseHandle(GetStdHandle(STD_INPUT_HANDLE))挂起 - 调用TerminateProcess() - 可以工作,但我希望优雅地退出
* 更新2:解决方案 *
- WriteConsoleInput()可以使std::getline()从阻塞读取中返回。这适用于任何msvc运行时库。有关工作解决方案的代码,请参见接受的答案。
下面是示例代码,显示了问题:
#include <iostream>
#include <thread>
#include <string>
#include <chrono>
int main(int argc, char *argv[])
{
bool stop = false;
std::thread *t = new std::thread([&]{
std::string line;
while (!stop && std::getline(std::cin, line, '\n')) {
std::cout << line;
}
});
std::this_thread::sleep_for(std::chrono::seconds(1));
stop = true;
// how to stop thread or make getline to return here?
return 0;
}
detach()
或join()
之前没有销毁线程,那么线程的析构函数将会调用std::terminate。 - Ivan Aksamentov - Drop