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
на цели, где эта инструкция доступна. (Он может даже сегрегироваться для атомарных объектов, доступных только для чтения, поэтому он на самом деле не идеален.)