想象一下以下情况:
class A {
public:
folly::Future<folly::Unit> fooA(std::function<void()> callback);
};
class B {
public:
void fooB() {
a_->fooA([] { doSomethingCheap_(); }) /* Executed in thread 1 */
.via(exec_.get())
.then([] { doSomethingExpensive_(); }) /* Executed in thread 2 */
}
private:
std::shared_ptr<folly::Executor> exec_;
std::shared_ptr<A> a_;
void doSomethingCheap_();
void doSomethingExpensive_();
};
如果在我们结束执行时doSomethingCheap_()
对象B b
将被销毁,那么我们将获得segfault
。可能我们可以在weak_ptr<B>
中保留class A
,但是当我们不仅要在class A
中使用class B
而在某些class C
中使用A + B + C -> D
时,这种方法是不可扩展的, ...
避免它的最佳方法是什么?
答案 0 :(得分:0)
我不熟悉愚蠢或你正在使用的同步机制,但似乎你可以使用你捕获的Mutex保护的bool并传递给lambda调用doSomethingExpensive - 这将是a&#34;穷人加入&#34;。锁定互斥锁,然后将bool翻转为true。或者,您可以使用类似于absl :: Notification [因为我所知道的]。
#include "absl/synchronization/notification.h"
class A {
public:
folly::Future<folly::Unit> fooA(std::function<void()> callback);
};
class B {
public:
void fooB() {
a_->fooA([] { doSomethingCheap_(); }) /* Executed in thread 1 */
.via(exec_.get())
.then([this] {
doSomethingExpensive_();
finished_.Notify();
}) /* Executed in thread 2 */
finished_.WaitForNotification();
}
private:
std::shared_ptr<folly::Executor> exec_;
std::shared_ptr<A> a_;
absl::Notification finished_;
void doSomethingCheap_();
void doSomethingExpensive_();
};
最终,加入主题似乎是正确的方法,我只是不确定愚蠢的内容。