是否可以取消C ++ 11或14中的阻塞调用?

时间:2018-07-12 16:33:17

标签: c++11 c++14 stdthread stdasync

我的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是最好的方法,那么在这种情况下如何有效使用它而不会造成不良副作用。

1 个答案:

答案 0 :(得分:2)

在Linux上,您可以获得本机线程句柄并使用pthread_cancel函数。前提是该线程未禁用取消功能,并且该线程在取消点被阻塞。您必须仔细阅读文档以了解所有警告。