is_lock_free() вернул false после обновления до MacPorts gcc 7.3

Ранее с Apple LLVM 9.1.0, is_lock_free() на 128-битных структурах вернули true. Иметь полный std::optional Поддержка, я затем обновился до MacPorts GCC 7.3. Во время моей первой попытки компиляции я столкнулся с этой печально известной ошибкой компоновщика showtopper:

Undefined symbols for architecture x86_64:
  "___atomic_compare_exchange_16", referenced from:

Я знаю, что мне нужно добавить -latomic, С Apple LLVM 9.1.0 она мне не нужна, и у меня очень плохое предчувствие по этому поводу. Если он не блокируется, вам обычно не нужно ссылаться на какую-либо дополнительную библиотеку, только компилятор может справиться с этим. В противном случае он может быть основан только на блокировке и требовать поддержки из дополнительной библиотеки. Так же, как я боялся, после добавления -latomicПостроить удалось, но is_lock_free() вернулся ложный.

Я думаю, что gcc 7.3 и его стандартная реализация библиотеки в порядке. Это может быть просто проблема конфигурации на моей стороне. На самом деле, я не делал никаких настроек. Я просто установил MacPorts GCC и сделал. Есть идеи, что мне не хватает?

1 ответ

Решение

Сам нашел ответ здесь.

gcc7 и позже будут вызывать libatomic вместо встраивания lock cmpxchg16b и вернет false от atomic_is_lock_free ( по причинам, в том числе и потому, что это так медленно, это не то, чего ожидают пользователи is_lock_free иметь в виду), но по крайней мере сейчас либатомная реализация по-прежнему использует lock cmpxchg16b на цели, где эта инструкция доступна. (Он может даже сегрегироваться для атомарных объектов, доступных только для чтения, поэтому он на самом деле не идеален.)

Другие вопросы по тегам