c++中如何保证智能指针的引用有效?

问题描述 投票:0回答:1

我有一个指标收集线程,用于检查工作线程以报告指标。 这些工作线程可以随时终止,那么如何确保当我调用工作线程的指标报告函数时,工作线程没有被终止呢?

我尝试使用

unique_ptr
,但这并不妨碍免费后使用。我不希望
MyMetricMonitor
拥有每项任务。

我可以创建共享指针,但我希望

MyTask
能够在任务完成时保持空闲

WeakPtr
这里最好吗?

示例:

#include <folly/Executor.h>
#include <folly/executors/CPUThreadPoolExecutor.h>
class MyTask {
 public:
  MyTask() : {}
  void run() {
  }
};

class MyMetricMonitor {
 public:
  void addTaskToMonitor(std::unique_ptr<MyTask>& task) {
    tasks.push_back(task);
  }
  void monitor() {
    for (auto& task : tasks_) {
      task->getMetric();
    }
  }

 private:
  std::vector<MyTask> tasks;
};

int main() {
    MyMetricMonitor monitor;
    std::thread monitorThread(monitor);

    auto executor = std::make_shared<folly::CPUThreadPoolExecutor>(
      2, std::make_shared<folly::NamedThreadFactory>("Worker"));
    // Submit a task that is a class instance
    folly::via(executor.get(), [] {
        std::unique_ptr<MyTask> task = std::make_unique<MyTask>(42);
        task.run();
        monitor.addTaskToMonitor(task)
    });
    monitorThread.join();
}
c++ c++17
1个回答
0
投票

c++中如何保证智能指针的引用有效?

它指的是“某物”,在“你”(作为信息的持有者)记下它之后,它可能会存在,也可能不会存在。

除此之外。你不知道。通过良好的设计,如果无效,您将永远不会取消引用底层指针。语言中没有“确保”。它是在你周围的人帮助你不使用低级语言的力量来破坏事物。

© www.soinside.com 2019 - 2024. All rights reserved.