首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链接p线程将禁用无锁的shared_ptr实现。

链接p线程将禁用无锁的shared_ptr实现。
EN

Stack Overflow用户
提问于 2016-02-17 23:47:00
回答 2查看 731关注 0票数 1

标题很大程度上传达了所有相关信息,但这里有一个最小的复制:

代码语言:javascript
复制
#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);
}

使用以下编译器选项进行编译将产生一个无锁的shared_ptr实现:

代码语言:javascript
复制
g++ -std=c++11 -march=native main.cpp

虽然这并不是:

代码语言:javascript
复制
g++ -std=c++11 -march=native -pthread main.cpp

GCC版本:5.3.0 (在Linux上使用libstdc++),在多台机器上进行测试,这些机器应该有必要的原子指令来完成这项工作。

有没有办法强制实现无锁(不管性能如何,我都需要无锁版本)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-18 00:11:58

如果在线程环境中使用shared_ptr,则需要有某种类型的锁--它们可以作为原子增量和减少来实现,但可能需要“更大”的锁来确保没有竞争。只有当只有一个线程时,无锁版本才能工作。如果您不使用线程,请不要链接到-lpthread

我确信有一些棘手的方法可以让编译器相信,您并没有真正使用线程作为共享的指针,但是如果您这样做了,您将处于脆弱的状态--如果将shared_ptr传递给线程会发生什么呢?您现在也许能够保证这一点,但是可能有人会不小心或有意地将其中一个引入到运行在另一个线程中的东西中,而这一切都会中断。

票数 2
EN

Stack Overflow用户

发布于 2016-02-18 03:29:21

有两件事是分开的:

  • 操纵控制块中的参考计数器(或等效的东西)通常是用无锁的atomics whenever possible实现的。这不是std::atomic_is_lock_free告诉你的。
代码语言:javascript
复制
- libstdc++'s `__shared_ptr` is [templated on the lock policy](https://stackoverflow.com/a/15141844/2756719), so you can explicitly use

模板使用shared_ptr_unsynchronized = std::__shared_ptr;

如果你知道你在做什么。

  • std::atomic_is_lock_free告诉您原子访问函数是否(std::atomic_{store, load, exchange, compare_exchange}等)在shared_ptr上是免费的.这些函数用于并发访问同一个shared_ptr对象,并且典型的实现将使用互斥对象。
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35470061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档