在不同的线程中执行期货时避免破坏对象

时间:2017-10-26 10:59:35

标签: c++ c++11 future

想象一下以下情况:

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时,这种方法是不可扩展的, ...

避免它的最佳方法是什么?

1 个答案:

答案 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_();
};

最终,加入主题似乎是正确的方法,我只是不确定愚蠢的内容。