1
7
Unsubscribe()应该是同步的,这样在保证观察者不再在主题列表中之前,它不会返回。这是唯一安全的方法。 ETA(将我的评论移至答案): 因为时间似乎不是问题,所以在通知每个观察者之间获取并释放互斥。您将无法按现在的方式使用for_,您必须检查迭代器以确保它仍然有效。
那会做你想做的。 |
2
3
你能把Subscribe()的签名改成Unsubscribe()吗?将观察者*替换为类似共享的内容<观察家>会让事情变得更容易。 编辑:将上面的“轻松”替换为“轻松”。 有关如何“纠正”这一点的示例,请参阅 Boost.Signals 以及 adopted -但还没有在发行中 Boost.Signals2 (以前是Boost.ThreadSafeSignals)库。 |
3
1
“理想”解决方案包括使用
注意:为了简单起见,我假设
异步的
想法很简单:我们将使用事件队列来实现同步。即:
您可以使用忙等待或条件变量,我建议使用条件变量,除非性能另有要求。
注意:此解决方案完全无法解释
|
4
1
与其让客户机收到“SafeToDelete”通知,不如向他们提供IssuSubscribed(Observer*)方法。然后,客户端代码变为:
这并不太繁重。 |
5
1
您可以在CSubject类型中创建“删除队列”。移除观察者时,可以调用PSObject->QueueForDelete(pObserver)。然后,当主题线程处于两个通知之间时,它可以安全地从队列中删除观察者。 |
6
1
嗯。。。我真的不理解你的问题,因为如果客户打电话取消订阅,你应该可以让客户删除它(你没有使用它)。但是,如果由于某种原因,在客户端取消订阅观察者后无法关闭关系,则可以添加“Subject”新操作以安全删除观察者,或者只是让客户端发出信号,表示他们不再对观察者感兴趣。 重新思考编辑 :好的,现在我想我明白你的问题了。我认为解决您问题的最佳方法是:
考虑到取消订阅操作将阻塞互斥锁以重置有效标志(并且该特定观察者将不再在线程中使用),代码是线程安全的,客户机可以在取消订阅返回后立即删除任何观察者。 |
7
1
这样的东西令人满意吗?在收到通知的同时取消订阅一个观察者仍然是不安全的,因为你需要一个你提到的界面(据我所知)。
如果您希望能够在Notify()中取消订阅()- (客户IMO的错误设计决策…) 您可以将通知程序线程的线程id添加到数据结构中。在Unsubscribe函数中,您可以根据当前线程的id检查线程id(大多数线程库都提供了这个功能-例如pthread_self)。如果它们相同,则无需等待条件变量即可继续。 注意:如果客户端负责删除观察者,这意味着您会遇到这样的情况:在Notify回调中,您将取消订阅并删除观察者,但仍在使用废弃的此指针执行某些操作。这是客户端必须知道的,并且只在Notify()结束时删除它。 |
8
0
我认为这即使不是很优雅,也能起到作用:
|
9
0
改变
|
Vedant · 如何解决python啦啦队长问题?[已关闭] 2 年前 |
cobby · 在战略模式中使用工厂模式? 2 年前 |
Nobody · Java中带while循环的三角形模式 2 年前 |
Eduard Stefanescu · 如何在层之间传输异常? 6 年前 |
D. Schreier Talha Noyon · 对于目录中的每个类 6 年前 |
Tanvi Jaywant · 如何重载类 6 年前 |