有联锁的吗?C++

Is there an Interlocked for this? C++

本文关键字:C++      更新时间:2023-10-16

请注意,这些构建是为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-动臂。

我的问题是,有没有一种方法可以让我使用某种Interlocked的东西,这样测试和调用就是原子的。

例如,对于析构函数中的引用计数对象,类似这样的东西可以在中工作

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

在这里,参考计数器会自动递减并针对零进行测试,然后,只有当等于零时,数据才会被释放。

有没有一种方法可以让我根据指针的有效性来调用函数?

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

至于订阅者本身。当他们脱离时,他们只是脱离了对出版商的倾听。它们本身将生活在静态对象中(这是我们需要的合同)。为什么?因为我们不能在通知期间持有锁。唯一的其他选项是使用Share_Ptr,由于将来的版本控制,决定不将其合并到此DLL中。

我创建了一个手工编写的shared_ptr,但后来我突然想到,任何对未封装在资源管理类中的对象的引用都会陷入同样的陷阱,并只是提出了一个"要求",即订阅者必须确保在所述订阅者的实现中不引用任何悬空引用。

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

有没有一种方法可以让我使用某种Interlocked的东西,这样测试和调用就是原子的。

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

要打电话,我对此表示怀疑。你需要一名警卫,即关键部门。

您可以使用"智能指针"策略对指针进行延迟置零。只要有人引用了指针(由互锁引用计数确定),就保持指针有效;当计数为零时,为空是安全的。

相关文章:
  • 没有找到相关文章