gpt4 book ai didi

C++ 线程安全延迟加载

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:11 27 4
gpt4 key购买 nike

我有一个类似于以下的属性:

private:
Foo* myFoo_m;

public:
Foo getMyFoo() const
{
if (myFoo_m == NULL)
{
myFoo_m = new Foo();
// perform initialization

这在单线程环境中运行良好,但是我如何在多线程环境中处理它?<​​/strong>我发现的大多数信息都与静态单例有关,但在这种情况下, myFoo 是一个公共(public)实例属性。

我正在从 C#(我可以使用 Lazy)和 Java(我可以使用双重检查锁定)移植它,但似乎没有一种直接的方法可以在 C++ 中执行此操作。 我不能依赖任何外部库(没有 BOOST),这需要在 Windows 和 Linux 上工作。我也不能使用 C++11。

任何见解都会很好。我是 C++ 新手。

最佳答案

如果您有权访问 c++11,您可以使用 std::mutex 来锁定防止多个线程初始化惰性部分。 (注意:std::mutex 仅在带有 VS2012 的 Windows 上可用)

您甚至可以使用 std::lock_guard 执行范围内的互斥锁获取:

private:

std::mutex m_init_mutex;

public:

Foo getMyFoo() const
{
{
std::lock_guard<std::mutex> lock(m_init_mutex);
if (myFoo_m == NULL)
{
myFoo_m = new Foo();
// perform initialization
}
}

编辑:OP 现在声明 C++11 不是一个选项,但也许这个答案在未来会有用

关于C++ 线程安全延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13198726/

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