【问题标题】:error: use of deleted function ‘std::atomic<_Tp>::atomic() [with _Tp = node]’错误:使用已删除的函数“std::atomic<_Tp>::atomic() [with _Tp = node]”
【发布时间】:2019-11-11 07:05:14
【问题描述】:

在使用基于类的原子时出现编译问题。

错误:使用已删除的函数“std::atomic<_tp>::atomic() [with _Tp = node]” 堆() { ^

/usr/include/c++/5/atomic:185:7: 注意:'std::atomic<_tp>::atomic() noexcept [with _Tp = node]' 被隐式删除,因为它的异常规范确实不匹配隐式异常规范'' atomic() noexcept = 默认; ^

#include <atomic>
#include <cstdlib>
#include <memory>

class node
{
private:
    int data;
    bool hasTransaction;
public:    
    node(int& data) : data(data), hasTransaction(true) {}
    node() : data(10), hasTransaction(true) {}
};

class stack {
    std::atomic<node> head;
public:
    void push(int data) {
        node new_node(data);

        node current = head.load(std::memory_order_relaxed);

        while (!head.compare_exchange_strong(
                    current,
                    new_node,
                    std::memory_order_release,
                    std::memory_order_relaxed))
            ;
    }

    stack() {
        node a;
        std::atomic_init(&head, a);
        head.store(a);
    };
};

int main()
{
    stack s;
    s.push(1);
    s.push(2);
    s.push(3);
}

【问题讨论】:

    标签: c++ atomic compare-and-swap


    【解决方案1】:

    这是因为您的node 类型的默认构造函数没有标记为noexceptstd::atomic&lt;T&gt;的默认构造函数被标记为noexcept,所以T的默认构造函数也必须是。

    应该是:

    node() noexcept : data(10), hasTransaction(true) {}
    

    但是,您可能应该知道,除非您的类型是微不足道的,否则这种“原子”类型可能会通过互斥锁成为线程安全的。因此,在这种情况下使用原子只会让你的生活更加艰难,没有任何收获。

    通常你不会想要使用原子,除非它用于一些原始类型(通常是原始指针或整数类型)。

    【讨论】:

    • 这意味着我应该使用 atomic 类型为 atomic ?而不是使用 atomic?
    • @Oktaheta 我会这样说:类型越复杂(类型越大),它实际上在硬件级别使用原子操作的可能性就越小。当不使用原子操作时,它需要使用例如一个互斥体来模拟它,这要慢得多。您的 node 类型仅包含一个 int 和一个 bool,因此您可以使用 std::atomic&lt;int&gt; 并通过按位算术将高位位视为 hasTransaction 标志。这也会将“节点”的大小从 8 个字节减少到 4 个字节。
    • 我明白了,这让我明白了,我宁愿使用原始指针 :)
    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2017-04-24
    • 1970-01-01
    • 2012-03-22
    相关资源
    最近更新 更多