Каковы точные требования для MyType для разрешения std :: atomi c<MyType>? - PullRequest
6 голосов
/ 15 января 2020

Я хотел бы передать некоторую информацию между потоками. Атомика звучит как то, что нужно использовать. Я посмотрел на это . И обнаружил, что простая структура типа

struct MyType{
  int val_a,val_b;
  float vals_c[5];
};

должна полностью заполнить утверждение:

static_assert( 
  std::is_trivially_copyable<MyType>::value &&
  std::is_copy_constructible<MyType>::value &&
  std::is_move_constructible<MyType>::value &&
  std::is_copy_assignable<MyType>::value &&
  std::is_move_assignable<MyType>::value, 
  "MyType is not suitable for std::atomic");

)

Но простая программа, такая как

//... MyType and static_assert

int main(int argc,char *argv[]){
   MyType a;
   std::atomic<MyType> b;
   b = a;
   a = b;
   return 0;
}

не компилируется с:

undefined reference to `__atomic_store'
undefined reference to `__atomic_load'

Я использую g cc версии 5.4 на 64-битной Ubuntu 16.04.

Используются флаги: -pipe -g -std=gnu++11 -Wall -W -fPIC

Это полное неправильное использование std::atomic? Каковы требования к MyType? Или в этой настройке чего-то не хватает?

1 Ответ

8 голосов
/ 15 января 2020

Как всегда, документация является вашим другом:

Первичный шаблон std::atomic может быть создан с любым TriviallyCopyable типом T, удовлетворяющим обоим CopyConstructible и CopyAssignable . Программа некорректна, если любое из следующих значений равно false:

std::is_trivially_copyable<T>::value
std::is_copy_constructible<T>::value
std::is_move_constructible<T>::value
std::is_copy_assignable<T>::value
std::is_move_assignable<T>::value

Итак, ваше утверждение хорошее.

Позже он говорит:

На g cc и clang, некоторые функции, описанные здесь, требуют связывания против -latomic.

Таким образом, если программа все еще не может быть собрана, вам может потребоваться ссылка на libatomic.

Если это все же не работает, возможно, у вас ошибка компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...