Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在两个线程之间共享截止期计时器_C++_Boost_Timer_Boost Thread - Fatal编程技术网

C++ 在两个线程之间共享截止期计时器

C++ 在两个线程之间共享截止期计时器,c++,boost,timer,boost-thread,C++,Boost,Timer,Boost Thread,我需要在两个线程之间共享boost::deadline\u计时器。boost文档称“共享实例不是线程安全的”。下面是一个示例代码: ClassA : public enable_shared_from_this<ClassA>{ ClassA() { m_timer = new boost::deadline_timer(m_io_service); } destroy() { m_timer->cancel(); delete

我需要在两个线程之间共享boost::deadline\u计时器。boost文档称“共享实例不是线程安全的”。下面是一个示例代码:

ClassA : public enable_shared_from_this<ClassA>{

  ClassA()
  {
    m_timer = new boost::deadline_timer(m_io_service);
  }

  destroy()
  {
    m_timer->cancel();
    delete m_timer;
    m_timer = NULL;
  }

  thread_method()
  {
    m_timer->expire_from_now(...);
    m_timer->async_wait(...);
  }

   run()
   {
     boost::thread t(ClassA::thread_method, shared_from_this);
   }
}
它是线程安全的吗

谢谢。

不,那没用

原子仅使指针的存储/加载不可分割。当您取消引用它时,您只是直接访问未同步的
截止时间计时器

所以你可以

  • 仅围绕对截止时间计时器的所有访问进行传统的线程同步(例如,使用
    互斥锁

  • 使用Asio
    创建执行的“逻辑”线程,并注意仅从该串访问死线计时器


strand方法可能更有效,但要求您更准确地考虑执行流程,以免意外创建数据竞争

您是否尝试编译自己的代码以查看是否存在任何问题?@inetknght为什么需要知道?他并不是真的在编译器错误或诸如此类的问题上寻求帮助。我认为那里有足够的信息(如果不是太多的话)。代码可以编译,但有时我会崩溃,因为线程试图访问m_timer,而另一个线程删除了m_timer。所以我想我需要在destroy()和thread_method()中使用互斥体,不是吗?我会使用互斥体,这样更简单。谢谢
boost::atomic<boost::deadline_timer*> m_timer;
m_timer = new boost::deadline_timer(m_io_service);