атомарные переменные в C - PullRequest
4 голосов
/ 22 марта 2011

Я хотел бы использовать атомарные переменные в C.

Я попробовал следующие предложенные встроенные функции в gcc, но получил ошибку ссылки undefined reference to `_sync_fetch_and_add'.

  type __sync_fetch_and_add (type *ptr, type value);
  type __sync_fetch_and_sub (type *ptr, type value);
  type __sync_fetch_and_or (type *ptr, type value);
  type __sync_fetch_and_and (type *ptr, type value);
  type __sync_fetch_and_xor (type *ptr, type value);
  type __sync_fetch_and_nand (type *ptr, type value);

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

  >less /proc/cpuinfo

  processor       : 0
  vendor_id       : GenuineIntel
  cpu family      : 6
  model           : 26
  model name      : Intel(R) Xeon(R) CPU           X5570  @ 2.93GHz
  stepping        : 5
  cpu MHz         : 1600.000



   >uname -a
   Linux xxxxxx 2.6.24.7-108.el5rt #1 SMP PREEMPT RT 
   Mon Mar 23 10:58:10 EDT 2009      x86_64 x86_64 x86_64 GNU/Linux

Знаете ли вы другие способы или библиотеки, которыеможет реализовать атомарные переменные для моей архитектуры или если я делаю что-то не так (возможно, некоторые флаги компиляции, которые я должен проверить)?

ПРИМЕЧАНИЕ: я нашел stdatomic.h, но, к сожалению, только для C ++

Пример использования:

int i =0;
i = _sync_fetch_and_add (&i,2);

Ответы [ 2 ]

4 голосов
/ 22 марта 2011

Этот ответ станет актуальным в 201X году.: -)

В следующем стандарте C1X вводится атомика в качестве функции языка Си.См. черновой стандарт C1X .

2 голосов
/ 22 марта 2011

Попробуйте параметр командной строки -march, атомарные встроенные функции доступны не для всех целевых архитектур. См. Также

...