提升 ASIO 和条件变量 - 奇怪的输出
boost asio and condition variables -- strange output
建议我有以下代码:
#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();
}
}
程序启动之间的输出将有所不同。例如
foo
timed_out
foo
foo
但是,如果我在循环内移动 boost::asio::io_service 对象构造,它会按预期工作:
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
为什么?我做错了什么?我该如何解决它?
提升 1.54, MSVC-11.0
如果我理解正确,您需要修复循环的最后一行(请参阅注释以获取说明):
// 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
因此,原始代码中存在两个问题:
-
io_service.stop()
将取消已发布但尚未处理的工作(通常这不是程序员想要的), -
io_service.reset()
需要将io_service
的状态从"停止"更改为"准备接受新工作"。
相关文章:
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 使用静态变量的递归调用的不同输出
- C++具有模板成员变量的类. 和参数内存输出
- 更改输出的变量
- 如何在C++中访问作用域的变量输出?
- 简化C++包括变量名称和函数输出的模式
- C++ - 输出与初始化变量不同?
- 程序未输出变量
- 学习C++,在结构中输出变量
- 试图理解GCC-XML输出变量的含义
- C++子类类型的输出变量
- 未修改 CUDA 内核函数输出变量
- C++ 文件输入/输出变量的奇怪行为
- 输出变量到文本文件
- 如何在OpenGL中输出变量数
- 使用OCILIB调用带有输出变量的Oracle过程
- c++习惯使用auto_ptr引用作为输出变量
- c++中输出变量名的通用方法
- 如何输出变量可除数
- 当我不输出变量时,代码中断;我什么时候工作。