std :: atomic_is_lock_free()对于shared_ptr返回false。无锁并发shared_ptr操作还有其他选择吗?

mar*_*hon 5 c++ concurrency atomic shared-ptr c++11

我有一个shared_ptr,它将被多个线程访问。我使用shared_ptr 的std :: atomic 函数来使该线程安全。std :: atomic_is_lock_free()检查std :: atomic是否真正使用CPU原子操作而不是锁。

此功能的注释如下:

除std :: atomic_flag以外的所有原子类型都可以使用互斥锁或其他锁定操作来实现,而不是使用无锁原子CPU指令来实现。原子类型有时也可以是无锁的,例如,如果在给定的体系结构上,只有对齐的内存访问自然是原子的,则相同类型的未对齐对象必须使用锁。如果类型有时是无锁的,则必须使用函数(1)或其成员函数等效项来确定特定实例是否无锁。

在MacOS Mavericks(带有c ++ 11 std)和Linux CentOS 5.6(带有boost)上运行这段代码都返回false。我认为x86_64具有相当强大的原子操作。

#include <iostream>
#include <unordered_map>
#include <atomic>
#include <memory>

typedef std::unordered_map<std::string, std::string> StringMap;

int main()
{

    std::shared_ptr<StringMap> pMap;
    std::atomic_store(&pMap, std::make_shared<StringMap>());
    std::cout << "unordered_map ptr is lock free:" << std::boolalpha << std::atomic_is_lock_free(&pMap) << "\n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的问题:就这些指针操作是无锁的而言,我是否很幸运,还是有其他选择?

编辑 这返回true:

std::atomic<StringMap*> apMap;
std::cout << "atomic ptr is lock free:" << std::boolalpha << apMap.is_lock_free() << "\n";
Run Code Online (Sandbox Code Playgroud)