我在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代码,该示例工作正常。
提前致谢。