c ++ 11原子对象的执行是否也是原子的?

Morcl174

我有一个对象,其所有功能应按顺序执行。我知道可以用互斥锁来做到这一点

#include <mutex> 

class myClass {
private:
    std::mutex mtx;
public:
    void exampleMethod();
};

void myClass::exampleMethod() {
    std::unique_lock<std::mutex> lck (mtx); // lock mutex until end of scope

    // do some stuff
}

但是使用此技术时,在exampleMethod中调用另一个互斥锁方法后会发生死锁。

所以我正在寻找更好的分辨率。默认的std :: atomic访问是顺序一致的,因此不可能同时读取对此对象的写入,但是现在当我访问我的对象并调用方法时,整个函数调用是否也是原子的或更多类似的东西

object* obj = atomicObj.load(); // read atomic
obj.doSomething(); // call method from non atomic object;

如果是,有没有比使用互斥锁锁定大多数功能更好的方法了?

炸鱼

停下来想一想何时实际需要锁定互斥锁。如果您有一些在许多其他函数中调用的辅助函数,则它不应尝试锁定互斥锁,因为调用者已经拥有了。

如果在某些情况下没有被另一个成员函数调用,因此确实需要获取一个锁,请提供一个实际执行该操作的包装器函数。拥有两个版本的成员函数(公共foo()和私有)并不罕见fooNoLock(),其中:

public:
void foo() {
    std::lock_guard<std::mutex> l(mtx);
    fooNoLock();
}

private:
void fooNoLock() {
    // do stuff that operates on some shared resource...
}

以我的经验,递归互斥是一种代码味道,表明作者并没有真正意识到使用函数的方式-并非总是错误的,但是当我看到一个时,我就感到可疑。

至于原子运算,它们实际上只能应用于小型算术运算,例如递增整数或交换2个指针。这些操作不是自动的原子操作,但是当您使用原子操作时,它们是可以用于这些操作的种类。对于单个原子对象上的2个单独的操作,您当然不能有任何合理的期望。在两次操作之间可能发生任何事情。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

标准C ++ 11是否可以保证memory_order_seq_cst防止StoreLoad对原子周围的非原子重新排序?

具有非原子变量的C ++ 11原子存储顺序

对c ++ 11原子变量的哪些操作实际上是原子的?

是否可以在C ++中创建原子向量或原子数组?

C ++原子数组是否也需要是原子的?

原子参数在C中的执行顺序

混合C ++ 11原子和OpenMP

C ++ 11原子容器的线程安全

C atomic中对非原子类型的原子操作是否是原子操作?

C ++原子对象无锁保证

C#对象类型-分配的原子性

标准C ++ 11是否保证`volatile atomic <T>`具有两种语义(volatile +原子)?

是否允许C ++ 11编译器引入额外的原子变量负载?

多线程中是否需要原子类型?(OS X,Clang,C ++ 11)

C ++是否保证参数评估的原子性?

是否可以在不使用C ++的情况下使用C11原子包含C标头?

在C ++ 11和OpenMP中以原子方式访问非原子内存位置?

C ++ 11(已消毒的g ++线程)使用原子对非原子操作进行排序(误报?)

c ++ 11多读取器/多写入器队列,使用原子表示对象状态和永久递增索引

C ++ 11原子:将它们与内存映射的I / O一起使用是否有意义?

MOV x86指令是否实现C ++ 11 memory_order_release原子存储?

C11原子和愈伤组织

在C ++ 11中字节操作是原子的吗?

在C11 / C ++ 11中,可能在同一内存上混合使用原子/非原子操作吗?

C ++原子:函数调用是否会充当内存屏障?

C ++原子列表容器

原子操作-C

原子变量C ++

C11和C ++ 11原子:获取释放语义和内存障碍