C++ boost asio和条件变量--奇怪的输出
建议我使用以下代码:C++ boost asio和条件变量--奇怪的输出,c++,boost,boost-asio,boost-thread,C++,Boost,Boost Asio,Boost Thread,建议我使用以下代码: #include <boost/asio/io_service.hpp> #include <boost/thread.hpp> #include <condition_variable> #include <iostream> #include <mutex> const int THREAD_POOL_SIZE = 2; std::condition_variable g_cv; std::mutex g
#include <boost/asio/io_service.hpp>
#include <boost/thread.hpp>
#include <condition_variable>
#include <iostream>
#include <mutex>
const int THREAD_POOL_SIZE = 2;
std::condition_variable g_cv;
std::mutex g_cv_mutex;
bool g_answer_ready;
void foo()
{
std::cout << "foo \n";
std::unique_lock<std::mutex> lock(g_cv_mutex);
g_answer_ready = true;
g_cv.notify_all();
}
int main()
{
boost::asio::io_service io_service;
for (int i = 0; i < 10; ++i)
{
std::auto_ptr<boost::asio::io_service::work> work(new boost::asio::io_service::work(io_service));
boost::thread_group threads;
for (int i = 0; i < THREAD_POOL_SIZE; ++i)
{
threads.create_thread(boost::bind(&boost::asio::io_service::run, &io_service));
}
std::unique_lock<std::mutex> lock(g_cv_mutex);
io_service.post(foo);
g_answer_ready = false;
g_cv.wait_for(lock, std::chrono::milliseconds(2000));
if (!g_answer_ready)
{
std::cout << "timed_out \n";
}
io_service.stop();
threads.join_all();
}
}
但是,如果我在循环中移动boost::asio::io_服务对象构造,它将按预期工作:
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
为什么??我做错了什么?我怎样才能修好它
boost 1.54,MSVC-11.0如果我理解正确,您需要修复循环的最后几行(请参阅注释了解说明):
//io_service.stop();
//线程。连接所有线程();
work.reset()//
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
// io_service.stop();
// threads.join_all();
work.reset(); // <- signal to process all pending jobs and quit from io_service::run function
threads.join_all(); // <- wait for all threads
io_service.reset(); // <- now `io_service` can accept new tasks