使用Boost.Asio和std :: promise的死锁

时间:2015-01-02 17:39:26

标签: c++ multithreading c++11 boost boost-asio

我在Linux中使用Boost 1.55和gcc 4.8。

我通常将boost :: asio与std :: promise / std :: future结合使用,但有时候,我的程序会死锁。这是一个简化的程序,显示了这种行为。

// Compile with: g++ -std=c++11 main.cpp -lpthread -lboost_system
#include <memory>
#include <functional>
#include <thread>
#include <future>
#include <cassert>

#include <boost/asio.hpp>

int main(int argc, char *argv[]) {
    boost::asio::io_service ioService;
    std::unique_ptr<boost::asio::io_service::work> work(new boost::asio::io_service::work(ioService));
    std::thread ioThread([&] () {
        ioService.run();
    });

    for (int i=0; i<1000; i++) {
        std::promise<bool> prom;
        std::future<bool> fut = prom.get_future();
        ioService.post([&prom] () {
            prom.set_value(true);
        });

        assert(fut.get());
    }

    work.reset();
    ioThread.join();
}

我是否正确使用了boost :: asio :: io_service? 调试程序时,两个线程都是死锁的,调用了promise :: set_value()和future :: get()方法。似乎std :: promise :: set_value()使用call_once()函数,该函数在调用内部Pthread函数时挂起。

在Windows(使用MSYS2)中,程序运行正常。 此外,如果我用基于std :: thread的代码(每次迭代的新线程)替换Boost.Asio代码,该示例工作正常。

提前致谢。

0 个答案:

没有答案