2013-05-13 4 views
1

Вот пример atomic counter Но я думаю, что это небезопасно.int v = n; это атом в gcc?

Коды: volatile int i;

int get_value() 
{ 
    return i; 
} 

int set_value(int x) 
{ 
    i = x; 
} 

Я знаю о gcc atomic builtin, но я не могу найти работу атомного заданного значения.

В моем коде, я думаю, чтобы получить ценность безопасно таким образом, нужно ли это?

inline uint64_t get_value() 
{ 
    return __sync_fetch_and_add(&m_value, 0L); 
} 

И я не могу установить значение атомарного.

+0

Не могли бы вы показать мне пример? –

ответ

0

Это зависит от того, что вы называете атомом точно. Если вы имеете в виду, что get() всегда будет возвращать значение, переданное в set_value, тогда ответ будет да практически на всех современных архитектурах.

Пример: Если поток 1, вызывает значение set_value 10 раз со значениями от 1 до 10, и у вас есть поток 2, печатающий возвращаемое значение get_value, вы увидите только значения от 1 до 10. Какие значения зависят от многих вещей , вы можете получить 10 раз «10» или 10 раз «1», но нет.

__sync_fetch_and_add работает также, но обеспечивает гораздо большую гарантию на такие вещи, как заказ памяти, но намного дороже.

+0

, но если вы не используете __sync_fetch_and_add для возврата значения, возникает проблема кэширования процессора (видимость памяти). –

+0

Использование __sync_fetch_and_add не связано с кешем. Практически все современные архитектуры имеют когерентность кеша, встроенную в аппаратное обеспечение, неважно, какие инструкции вы используете. То, что __sync_fetch_and_add делает, обеспечивает некоторую форму заказа в видимости других мест памяти. Вот что я сказал в своем ответе: «Это зависит от того, что вы называете атомным». Например, если вы делаете ссылку на подсчет, важно иметь декремент, операции увеличения, возвращающие старое значение счетчика, и вам нужно будет __sync_fetch_and_add для этого – Guillaume

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