boost :: io_service :: post thread是否安全?

时间:2011-06-16 08:50:20

标签: c++ thread-safety boost-asio boost-thread

从处理程序中发布新的处理程序是否安全? 即调用io_service::run()的线程可以将新处理程序发布到同一个io_service吗?

由于

2 个答案:

答案 0 :(得分:8)

根据文档,safeio_service的单个实例的处理程序中发布处理程序。

  

线程安全

     

不同的对象:安全。

     

共享对象:安全,但调用reset()时除外   还有未完成的run(),run_one(),   poll()或poll_one()调用结果   未定义的行为。

答案 1 :(得分:0)

我认为这不是因为下面的代码没有返回3000000而且我没有看到互斥量同步io_service的内部队列既不是无锁队列。

#include <boost/asio/io_service.hpp>
#include <boost/thread.hpp>
#include <boost/thread/detail/thread_group.hpp>
#include <memory>

void postInc(boost::asio::io_service *service, std::atomic_int *counter) {
  for(int i = 0; i < 100000; i++) service->post([counter] { (*counter)++; });
}

int main(int argc, char **argv)
{
  std::atomic_int counter(0);

  {
    boost::asio::io_service service;
    boost::asio::io_service::work working(service);
    boost::thread_group workers;

    for(size_t i = 0; i < 10;++i)     workers.create_thread(boost::bind(&boost::asio::io_service::run, &service));

    boost::thread_group producers;
    for (int it = 0; it < 30; it++)
    {
      producers.add_thread(new boost::thread(boost::bind(postInc,&service,&counter)));
    }

    producers.join_all();
    std::cout << "producers ended" << std::endl;

    service.stop();
    workers.join_all();
  }

  std::cout << counter.load();

  char c; std::cin >> c;
  return 0;
}