【问题标题】:Boost Threads and Boost Asio提升线程和提升 Asio
【发布时间】:2012-05-12 18:30:06
【问题描述】:

我正在研究 Boost Threads 和 Asio(异步输入/输出),我写了下面的例子来把一些概念放在一起。

class Worker {
  private:
    boost::asio::io_service&     m_ios;
    boost::asio::deadline_timer  m_timer;
    unsigned                     m_cycles;
    unsigned                     m_time2wait;
    std::string                  m_threadName;

  public:
    Worker(boost::asio::io_service& ios,
           unsigned cycles, unsigned time2wait, const std::string& name);
    ~Worker ();
    void start ();
    void run ();
    void stop ();
};


Worker::Worker (boost::asio::io_service& ios,
                unsigned cycles, unsigned time2wait, const std::string& name)
: m_ios(ios),
  m_timer(ios, boost::posix_time::seconds (1)),
  m_cycles(cycles),
  m_time2wait(time2wait),
  m_threadName(name)
{
  logMsg(m_threadName, "is starting . . . ");
}

Worker::~Worker()
{
  logMsg(m_threadName, "is ending . . . ");
}

void Worker::start()
{
  logMsg (m_threadName, "start was called");

  m_timer.expires_at (m_timer.expires_at () +
              boost::posix_time::seconds (m_time2wait));
  m_timer.async_wait (boost::bind (&Worker::run, this));
}

void Worker::stop()
{
}

void Worker::run()
{
  if (m_cycles > 0)
  {
    logMsg (m_threadName, "run # ", m_cycles);
    --m_cycles;
    m_timer.expires_at (m_timer.expires_at() +
                        boost::posix_time::seconds(m_time2wait));
    m_timer.async_wait(boost::bind(&Worker::run, this));
  }
  else {
    logMsg (m_threadName, "end of cycling");
  }
}

void run_threads (boost::asio::io_service& io_srv)
{
  Worker worker_1(io_srv, 5, 2, "worker 1");
  Worker worker_2(io_srv, 5, 4, "worker 2");
  worker_1.start();
  worker_2.start();

  boost::shared_ptr <boost::thread> worker_Thread_One (
    new boost::thread (boost::bind (&boost::asio::io_service::run, &io_srv)));

  boost::shared_ptr <boost::thread> worker_Thread_Two (
    new boost::thread(boost::bind(&boost::asio::io_service::run, &io_srv)));

  worker_Thread_One->join();
  worker_Thread_Two->join();
}

int main (int argc, char** argv)
{
  boost::asio::io_service ios;

  run_threads(ios);

  return 0;
}

我正在尝试让一些线程并行工作,每个线程都通过特定对象完成工作。该示例显然似乎有效,但我感觉混合线程和 Asio (糟糕的设计)是错误的。让线程与 Asio 一起工作是否正确(一个 io_service 用于多个线程)?

线程对象和“worker”对象是如何“绑定”在一起的?我认为他们不像我想的那样。例如,如果我实例化了两个对象和两个线程,我就有了预期的输出。如果我实例化两个对象和一个线程,程序的输出是相同的。

(logMsg 是一个简单的 cout 包装器,带有互斥锁以同步输出操作。)

【问题讨论】:

  • 当你提出问题时,尽量保持信息丰富。
  • 代码看起来很正常。我可能会使用system_timer 而不是deadline_timer。 deadtime_timer 会做一堆日历工作,而 system_timer 只在“ticks”中工作

标签: multithreading boost boost-asio


【解决方案1】:

您的示例看起来正确,但在这种情况下没有必要使用 Asio。当您使用io_service 作为线程池的工作队列时,Asio + 线程最有用。如果您想以这种方式使用它,请查看io_service::post

【讨论】:

    【解决方案2】:

    asio::io_service 只是一个系统任务经销商,它持有一个任务队列,并处理它,你不必这样使用它,你应该创建一个包含io_service::run() 的自己的函数的线程。 线程和io_service 可以是一对一,也可以是多对一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多