当前位置:  开发笔记 > 编程语言 > 正文

CreateTimerQueueTimer回调和竞争条件

如何解决《CreateTimerQueueTimer回调和竞争条件》经验,为你挑选了0个好方法。

我正在我的应用程序中使用计时器队列,并将指针传递给我自己的一个C++ Timer对象作为回调的"参数"(在CreateTimerQueueTimer中).然后我在回调中的对象上调用虚方法.

Timer对象的析构函数将确保使用DeleteTimerQueueTimer()取消计时器.

static void callback( PVOID param, BOOLEAN timerOrWaitFired )
{
    Timer* timer = reinterpret_cast< Timer* >( param );
    timer->TimedOut();
}

class Timer
{
public:
   Timer();

   virtual ~Timer()
   {
       ::DeleteTimerQueueTimer( handle );
   }

   void Start( double period )
   {
      ::CreateTimerQueueTimer( &handle, ..., &callback, this, ... );
   }

   virtual void TimedOut() = 0;

   ...
};

但是,有一个微妙的竞争条件,如果已经调用了回调,但是在调用TimedOut()之前销毁了计时器对象,则应用程序崩溃,因为回调调用不存在的对象上的虚方法.或者更糟糕的是,它被删除了.

我确实有互斥锁来控制多线程调用,但我仍然遇到问题.

使用对象指针作为回调参数真的是个好主意吗?由于不保证线程之间的同步,它对我来说闻起来很糟糕.

有更好的解决方案吗?其他人做什么?

发生的一件事是保留一组指向每个Timer实例的指针(添加构造函数,在析构函数中删除).但我认为这不会起作用,因为如果从中派生出Timer,我们只会从基类析构函数中的集合中删除指针; 如果我们已经开始销毁派生对象,则已经完成了损坏.

干杯.

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有