2016-03-28 2 views
5
void HelloWorld() 
{ 
    static std::atomic<short> static_counter = 0; 
    short val = ++static_counter; // or val = static_counter++; 
} 

Если эта функция вызывается из двух потоков,Потокобезопасная локальная переменная

Может локальная переменная val быть в обоих потоков 1? или (0, если используется static_counter++?)

+1

Возможный дубликат http://stackoverflow.com/questions/8102125/is-local-static-variable-initialization-thread-safe-in-c11 – user2807083

+0

@ user2807083 Это не вопрос. Я знаю, что static_counter будет инициализирован безопасно. Для этого требуется стандарт C++ 11. Я говорю о val, который не является статичным. – James

+1

Я думаю, что это ничего не значит о вашем локальном 'var', но все о операторе ++ применительно к статической переменной. Поэтому я думаю, что правильный вопрос: «Является ли приращение атомной переменной потоком безопасным?» – user2807083

ответ

2

Может ли локальная переменная val быть 1 в обоих потоках?

++static_counter Количество эквивалентно:

fetch_add(1)+1 

, которые не могут возвращать же значение для двух (или более) нитями , потому чтоfetch_add выполняется атомарно.

+0

То же самое относится к static_counter ++? – James

+0

Да. Это эквивалентно 'fetch_add (1)'. Пожалуйста, прочитайте [doc] (http://en.cppreference.com/w/cpp/atomic/atomic/operator_arith) для получения более подробной информации. – Nawaz

+0

Есть две вещи, связанные с конструкцией объекта static_counter и приращением. Последнее гарантировано будет атомарным, но, согласно ссылке в комментариях, строительство не является. –

2

№. Единственный способ, которым может быть одно и то же значение в обоих потоках, - это то, что две атомные операции перекрываются. По определению, атомарные операции не могут пересекаться.

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