作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个类似于以下的属性:
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/
我是一名优秀的程序员,十分优秀!