Gus*_*orn 1 c++ atomic lock-free shared-ptr c++11
标题几乎传达了所有相关信息,但这里是一个最小的重复:
#include <atomic>
#include <cstdio>
#include <memory>
int main() {
auto ptr = std::make_shared<int>(0);
bool is_lockless = std::atomic_is_lock_free(&ptr);
printf("shared_ptr is lockless: %d\n", is_lockless);
}
Run Code Online (Sandbox Code Playgroud)
使用以下编译器选项进行编译会产生无锁shared_ptr实现:
g++ -std=c++11 -march=native main.cpp
Run Code Online (Sandbox Code Playgroud)
虽然这不是:
g++ -std=c++11 -march=native -pthread main.cpp
Run Code Online (Sandbox Code Playgroud)
GCCversion :( 5.3.0在Linux上,使用libstdc++),在多台机器上进行测试,这些机器应具有必要的原子指令才能使其工作.
有没有办法强制实现无锁实现(我需要无锁版本,无论性能如何)?
T.C*_*.C. 10
有两个不同的东西:
控制块(或等效物)中的参考计数器的操纵通常尽可能使用无锁原子来实现.这不是什么std::atomic_is_lock_free告诉你.
libstdc ++ __shared_ptr是锁定策略的模板,因此您可以明确使用
template<typename T>
using shared_ptr_unsynchronized = std::__shared_ptr<T, __gnu_cxx::_S_single>;
Run Code Online (Sandbox Code Playgroud)
如果你知道你在做什么
std::atomic_is_lock_free告诉你原子访问函数(std::atomic_{store, load, exchange, compare_exchange}等)是否shared_ptr是无锁的.这些函数用于同时访问同一 shared_ptr对象,典型的实现将使用互斥锁.