我的gcc编译器支持C ++14。
场景:
我想知道是否有一种方法可以强制取消阻止呼叫并安全地停止std::thread
。
代码:
// Member vars declared in MyClass.hpp
std::atomic<bool> m_continue_polling = false;
std::thread m_thread;
StartThread() {
m_continue_polling = true;
m_thread = std::thread { [this] {
while (m_continue_polling) {
int somevalue = ReadValue(); // This is a blocking call and can take minutes
}
}};
}
StopThread() {
m_continue_polling = false;
try {
if (m_thread.joinable()) {
m_thread.join();
}
}
catch(const std::exception & /*e*/) {
// Log it out
}
}
在上面的代码ReadValue
中,是一个阻塞调用,该调用进入一个库并读取fd,而fd上某些我无法控制的设备驱动程序相关代码。
问题:
我需要StopThread
才能停止线程并取消在ReadValue
上阻塞的调用。 我该怎么办? C ++ 11或14有什么方法吗?
PS:
可能std::async
是一个解决方案?但我想知道是否有更好的方法。如果std::async
是最好的方法,那么在这种情况下如何有效使用它而不会造成不良副作用。
答案 0 :(得分:2)
在Linux上,您可以获得本机线程句柄并使用pthread_cancel
函数。前提是该线程未禁用取消功能,并且该线程在取消点被阻塞。您必须仔细阅读文档以了解所有警告。