C++;对象终止通知 在C++程序中,我有两个引用计数对象:国王< /强>和继承人< /强>。继承人需要封锁直到国王被摧毁。King是一个引用计数的对象,当它的引用计数为零时,它将被销毁。若继承人持有对国王的引用,则国王的引用计数将永远不会为零。在国王被摧毁之前,如何拥有继承人区块?

C++;对象终止通知 在C++程序中,我有两个引用计数对象:国王< /强>和继承人< /强>。继承人需要封锁直到国王被摧毁。King是一个引用计数的对象,当它的引用计数为零时,它将被销毁。若继承人持有对国王的引用,则国王的引用计数将永远不会为零。在国王被摧毁之前,如何拥有继承人区块?,c++,reference,blocking,C++,Reference,Blocking,您可以使用非所有权(或“弱”)引用,类似于 至于等到国王死,你可以使用一个互斥锁,国王可以一直持有直到他死,并让继承人块等待国王释放它 如果您需要多个继承人等待,并且对继承人有一定的排序,您可以使用“继承人选择器”对象跟踪继承人列表及其优先顺序,当国王释放互斥锁时,它会将互斥锁的所有权分配给列表中的下一个继承人。谢谢@James。以下是我最终采用的解决方案: 互斥体方法似乎很有前途,但大多数互斥体希望获取线程和释放线程是相同的。最后,我让Heir在堆栈上创建一个计数为零的信号量,将指向该信号量的

您可以使用非所有权(或“弱”)引用,类似于

至于等到国王死,你可以使用一个互斥锁,国王可以一直持有直到他死,并让继承人块等待国王释放它


如果您需要多个继承人等待,并且对继承人有一定的排序,您可以使用“继承人选择器”对象跟踪继承人列表及其优先顺序,当国王释放互斥锁时,它会将互斥锁的所有权分配给列表中的下一个继承人。

谢谢@James。以下是我最终采用的解决方案:


互斥体方法似乎很有前途,但大多数互斥体希望获取线程和释放线程是相同的。最后,我让Heir在堆栈上创建一个计数为零的信号量,将指向该信号量的指针传递给King,释放King,然后尝试获取该信号量。计数为零,因此继承人立即阻止。当调用King的析构函数时,它会调用信号量上的“release”。对于Rogue Wave信号,这似乎可以正常工作

呸。。我们回答了同样的问题,而你在等待部分又增加了一点。删除了我的,增加了你的。只是补充一句,继承人应该持有对国王的弱ptr引用。弱ptr不起作用——至少在没有投票的情况下是不行的。为了在King上执行阻塞方法,必须取消弱ptr的引用。发生这种情况时,您会得到一个对该对象的强引用,并将其保持到作用域内。@brianegge:您需要一个互斥或其他信号方法来确保只有一个king。
弱\u ptr
只允许继承人引用国王,但不能阻止国王死亡。@brianegge:或者,国王在继承人试图进入互斥体之前,持有一个指向该互斥体的强指针。复制完成后,弱指针将再次变弱。