Mik*_*g36 4 c++ multithreading lazy-loading
我有一个类似于以下的属性:
private:
Foo* myFoo_m;
public:
Foo getMyFoo() const
{
if (myFoo_m == NULL)
{
myFoo_m = new Foo();
// perform initialization
Run Code Online (Sandbox Code Playgroud)
这在单线程环境中运行良好,但如何在多线程环境中处理此问题?我发现的大部分信息都涉及静态单例,但在这种情况下,myFoo是一个公共实例属性.
我从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
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:OP现在声称C++ 11不是一个选项,但也许这个答案将来会有用
| 归档时间: |
|
| 查看次数: |
739 次 |
| 最近记录: |