gpt4 book ai didi

c++ - 当在另一个线程上完成工作时,有没有办法保护智能指针不在一个线程上被释放?

转载 作者:行者123 更新时间:2023-12-05 09:33:53 25 4
gpt4 key购买 nike

在我们的程序中,我们有一个类 FooLogger 用于记录特定事件(字符串)。我们使用 FooLogger 作为 unique_ptr

我们有两个线程使用这个 unique_ptr 实例:

  1. 线程 1 在 while 循环中将最新事件记录到文件中,首先检查实例是否不是 nullptr
  2. 线程 2 在程序到达某个点时释放 FooLogger unique_ptr 实例(设置为 nullptr)

但是,由于交错错误,在记录日志时,FooLogger 的成员变量可能会被释放,从而导致 EXC_BAD_ACCESS 错误。

class FooLogger {
public:
FooLogger() {};

void Log(const std::string& event="") {
const float32_t time_step_s = timer_.Elapsed() - runtime_s_; // Can get EXC_BAD_ACCESS on timer_
runtime_s_ += time_step_s;

std::cout << time_step_s << runtime_s_ << event << std::endl;
}

private:
Timer timer_; // Timer is a custom class
float32_t runtime_s_ = 0.0;
};


int main() {
auto foo_logger = std::make_unique<FooLogger>();

std::thread foo_logger_thread([&] {
while(true) {
if (foo_logger)
foo_logger->Log("some event");
else
break;
}
});

SleepMs(50); // pseudo code
foo_logger = nullptr;

foo_logger_thread.join();
}

是否有可能使用某种线程同步/锁等来确保 foo_logger 实例在记录时不被释放?如果没有,有什么好的处理方法吗?

最佳答案

std::unique_ptr 的目的是在 std::unique_ptr 超出范围时释放实例。在您的情况下,您有多个线程,每个线程都可以访问该元素,并且拥有的线程可能会先于其他用户被淘汰。

您要么需要确保所有者线程永远不会在用户线程之前被删除,要么将所有权模型从 std::unique_ptr 更改为 std::shared_ptrstd::shared_ptr 的全部目的是确保对象在您使用它时一直存在。

您只需要弄清楚程序需要什么,并使用正确的工具来实现它。

关于c++ - 当在另一个线程上完成工作时,有没有办法保护智能指针不在一个线程上被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66965949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com