2013-05-07 2 views
1

На 12.04 системе Ubuntu, когда я пытаюсь компиляции следующий код:станд :: atomic_thread_fence имеет неопределенные ссылки

#include <atomic> 
int a; 
int main() 
{ 
    a = 0; 
    std::atomic_thread_fence(std::memory_order_acquire); 
    a = 1; 
} 

Я получаю сообщение об ошибке, например:

g++ test.cpp -std=c++0x 
/tmp/ccayKntC.o: In function `main': test.cpp:(.text+0x14): undefined reference to `std::atomic_thread_fence(std::memory_order)' collect2: ld returned 1 exit status 

Это происходит при компиляции с clang++ также. Поскольку это ошибка компоновщика, я предполагаю, что моя версия libstdC++ не обладает необходимой функциональностью. Однако, похоже, работают другие атомные операции.

Я использую Ubuntu 12.04. Мне интересно, есть ли проблема с моей настройкой системы, является ли это отсутствующей функцией из моего libstdC++ или, возможно, что-то еще. И в идеале я хотел бы решить эту проблему.

ответ

2

Это действительно ошибка, которая была зафиксирована в 4,7 отрасли:

Я думаю, вам нужно использовать __sync_synchronize или что-то вроде __asm__ __volatile__ ("mfence" ::: "memory")

Некоторые люди любят быть очень строгие около which synchronization operation им нужны, но я думаю, что для обычных случаев достаточно всего mfence.

+0

Спасибо, что я установил gcc 4.7 из PPA и это исправило проблему для меня. –

Смежные вопросы