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)
归档时间: |
|
查看次数: |
1275 次 |
最近记录: |