Атомарная структура, содержащая указатель

avatar
birneee
5 августа 2020 в 15:06
109
1
1
#include <atomic>
#include <iostream>

using namespace std;

struct Simple{
    int a = 0;
    int b = 0;
};

struct WithPointer{
    int *a = nullptr;
    int b = 0;
};

int main(int argc, char const *argv[])
{
    atomic<Simple> simple;
    cout<<simple.is_lock_free()<<"\n";
    
    atomic<Simple*> simple_p;
    cout<<simple_p.is_lock_free()<<"\n";

    atomic<WithPointer> with_pointer;
    cout<<with_pointer.is_lock_free()<<"\n";

    return 0;
}

Этот пример отлично работает для структуры Simple, но не для структуры WithPointer. Я получаю следующую ошибку компиляции, почему? Что я могу сделать.

g++ main.cpp
/usr/bin/ld: /tmp/cc49YEoR.o: in function `std::atomic<WithPointer>::is_lock_free() const':
1a.cpp:(.text._ZNKSt6atomicI11WithPointerE12is_lock_freeEv[_ZNKSt6atomicI11WithPointerE12is_lock_freeEv]+0x1d): undefined reference to `__atomic_is_lock_free'
collect2: error: ld returned 1 exit status
Источник
cigien
5 августа 2020 в 15:10
0

Связанный/обман coderhelper.com/questions/44891523/… Однако ответа нет.

birneee
5 августа 2020 в 15:19
0

Я также получаю ту же ошибку при других атомарных операциях, таких как загрузка

cigien
5 августа 2020 в 15:20
0

Смотрите мой ответ. связывание с -latomic должно исправить все неопределенные ссылки.

Ответы (1)

avatar
cigien
5 августа 2020 в 15:16
3

Вам необходимо скомпилировать программу с флагом -latomic на clang и gcc. демонстрация.