相关疑难解决方法(0)

volatile struct = struct不可能,为什么?

struct FOO{
    int a;
    int b;
    int c;
};

volatile struct FOO foo;

int main(void)
{
    foo.a = 10;
    foo.b = 10;
    foo.c = 10;
    struct FOO test = foo;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这将无法编译,因为 struct FOO test = foo; 生成错误:

错误:'const FOO&'类型的绑定引用到'volatile FOO'会丢弃限定符

如何在C++中复制volatile struct到另一个struct(在C++ 11之前)?

许多人建议只删除volatile,但在这种情况下我不能这样做,因为我想在μC内复制当前的SPI-Reg设置,并且这被制造商标题声明为volatile.我想复制这些设置,因为制造商还提供了一个库来使用SPI进行EnDat-Communication,而我无法访问源代码.由于我必须在运行期间更改SPI-Reg-Settings,因此我希望能够轻松返回到库SPI设置,而无需再次调用init_endat() - lib fkt(如果我将其调用两次,则未指定会发生什么).

我可以使用memcopy()吗?

如上所述,这是以下问题的副本.

为什么我没有从volatile中提供默认的复制构造函数?

c++ struct volatile

23
推荐指数
2
解决办法
2311
查看次数

用 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++ ×2

c++11 ×1

lockless ×1

seqlock ×1

stdatomic ×1

struct ×1

volatile ×1