相关疑难解决方法(0)

num ++是'int num'的原子吗?

一般地,对于int num,num++(或++num),作为读-修改-写操作中,是不是原子.但我经常看到编译器,例如GCC,为它生成以下代码(在这里尝试):

在此输入图像描述

由于第5行对应于num++一条指令,我们可以得出结论,在这种情况下num++ 是原子的吗?

如果是这样,是否意味着如此生成num++可以在并发(多线程)场景中使用而没有任何数据争用的危险(例如,我们不需要制作它,std::atomic<int>并强加相关成本,因为它是无论如何原子)?

UPDATE

请注意,这个问题不是增量是否原子的(它不是,而且是问题的开头行).它是否可以在特定场景中,即在某些情况下是否可以利用单指令性质来避免lock前缀的开销.而且,作为公认的答案约单处理器的机器,还有部分提到这个答案,在其评论和其他人谈话解释,它可以(尽管不是C或C++).

c c++ assembly multithreading atomic

148
推荐指数
8
解决办法
1万
查看次数

如何使用std :: atomic <>

我有一个类,我想在不同的线程中使用,我想我可以使用std::atomic这种方式:

class A
{
    int x;

public:
    A()
    {
        x=0;
    }

    void Add()
    {
        x++;
    }

    void Sub()
    {
        x--;
    }     
};
Run Code Online (Sandbox Code Playgroud)

在我的代码中:

  std::atomic<A> a;
Run Code Online (Sandbox Code Playgroud)

并在另一个线程中:

  a.Add();
Run Code Online (Sandbox Code Playgroud)

  a.Sub();
Run Code Online (Sandbox Code Playgroud)

但我收到一个a.Add()未知的错误.我怎么解决这个问题?

有没有更好的方法来做到这一点?

请注意,这是一个示例,我想要的是确保对A类的访问是线程安全的,所以我不能使用

std::atomic<int> x;
Run Code Online (Sandbox Code Playgroud)

如何使用线程安全的类std::atomic

c++ multithreading atomic c++11

29
推荐指数
3
解决办法
5万
查看次数

如何用c ++ 11 CAS实现ABA计数器?

我正在实现一个基于此算法的无锁队列,该算法使用计数器来解决ABA问题.但我不知道如何用c ++ 11 CAS实现这个计数器.例如,从算法:

E9:    if CAS(&tail.ptr->next, next, <node, next.count+1>)
Run Code Online (Sandbox Code Playgroud)

它是一个原子操作,意思是如果tail.ptr->next等于next,则tail.ptr->next指向node同时(原子地)产生next.count+1.但是,使用C++ 11 CAS,我只能实现:

std::atomic_compare_exchange_weak(&tail.ptr->next, next, node);
Run Code Online (Sandbox Code Playgroud)

这不可能next.count+1同时发生.

c++ multithreading lock-free lockless c++11

5
推荐指数
1
解决办法
1924
查看次数

用 32 位原子实现 64 位原子计数器

我想从原子 uint32s 拼凑一个 uint64 原子计数器。计数器有一个写入器和多个读取器。编写器是一个信号处理程序,所以它不能阻塞。

我的想法是使用低位的代数作为读锁。读取器重试,直到整个读取过程中生成计数稳定,并且低位未设置。

以下代码在内存排序的设计和使用中是否正确?有没有更好的办法?

using namespace std;
class counter {
    atomic<uint32_t> lo_{};
    atomic<uint32_t> hi_{};
    atomic<uint32_t> gen_{};

    uint64_t read() const {
        auto acquire = memory_order_acquire;
        uint32_t lo, hi, gen1, gen2;
        do {
            gen1 = gen_.load(acquire);
            lo = lo_.load(acquire);
            hi = hi_.load(acquire);
            gen2 = gen_.load(acquire);
        } while (gen1 != gen2 || (gen1 & 1));
        return (uint64_t(hi) << 32) | lo;
    }

    void increment() {
        auto release = memory_order_release;
        gen_.fetch_add(1, release);
        uint32_t newlo = 1 + lo_.fetch_add(1, release);
        if (newlo …
Run Code Online (Sandbox Code Playgroud)

c++ lockless c++11 stdatomic seqlock

1
推荐指数
1
解决办法
1029
查看次数

标签 统计

c++ ×4

c++11 ×3

multithreading ×3

atomic ×2

lockless ×2

assembly ×1

c ×1

lock-free ×1

seqlock ×1

stdatomic ×1