c++ - 这个有互锁吗? C++

标签 c++ multithreading concurrency thread-safety interlocked

请注意 - 这些构建是针对 VS2008/VS2010 构建的,我不能使用任何 11 种构造。

假设我有订阅者收听某个发布者。我的发布者有一个订阅者指针容器。在我的 void detach(ISubscriber *) 中,我没有锁定订阅者列表,而是为该订阅者“NULL”了指针,因为没有更好的词了。

//My container in the publisher.  Inserts to not invalidate, removals only invalidate iterators pointing to the removed element, for this reason we NULL
Container<ISubscriber *> myContainer;

Now in the publisher...
void NotifySubscribers(){
   foreach(subscriber in container){
      if(subscriber)//This is my problem
         subscriber->notify()
   }
}

第 3 行 - 指针经过测试并指向有效对象。 在执行第 4 行之前,另一个线程将订阅者置为 NULL。 4 号线 - 繁荣。

我的问题是,有没有一种方法可以使用某种互锁的东西,以便测试和调用是原子的。

例如对于析构函数中的引用计数对象,类似这样的方法有效

 RefCountObject::~RefCountObject(){
    if(InterlockedDecrement(&m_count) == 0)
      delete m_data;
 }

在这里,引用计数器递减并自动测试是否为零,然后只有当等于零时,数据才会被释放。

有没有办法根据指针的有效性来调用函数?

编辑 1:我需要根据评论澄清一点,感谢您的回复。发布者不负责订阅者的“释放内存”,因此不会发生泄漏。通知后,发布者将执行一个循环,通过删除无效的订阅者来清理容器。

现在关于订阅者本身。当他们脱离时,他们只是脱离了对发布者的聆听。它们本身将在静态对象中继续存在(这是我们需要的契约)。为什么?因为我们不能在通知期间持有锁。唯一的其他选择是使用 Share_Ptr,由于将来的版本控制,决定不将其合并到此 DLL 中。

我创建了一个手写的 shared_ptr,但后来我想到任何对未包装在资源管理类中的对象的引用都会落入同样的陷阱,并且只是插入订阅者必须做出的“要求”一定不要在他们对所述订户的实现中引用任何悬空引用。

这让我们回到刚才所说的,订阅者不能被“释放”,目前所有将使用它的客户端都是静态对象。我们只是展望 future 。一些用户是遗留应用,不容易引入 enabled_shared_from_this 等。

最佳答案

is there a way that I can use some sort of Interlocked something such that the test and call is atomic.

为了测试,是的,会有办法的。你只想比较一个指针。

做电话,我怀疑。您需要在调用周围进行保护,即关键部分。

关于c++ - 这个有互锁吗? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12467105/

相关文章:

java - 并发线程化图像处理类

python - C++ 扩展中的 DateTime 对象方法出现问题

java - 在 c++/python/java 中内置抽象数据类型

c++ - 通过计时器在 pthread 之间切换

python - sleep 而不中断程序

java - 如何使用 JProgressBar

c++ - 指向类方法的指针

c++ - 无法创建表示外在欧拉旋转的矩阵

multithreading - 如何让delphi等待30秒然后继续

java - 如何检测Java中的临界区域?