Форум программистов, компьютерный форум CyberForum.ru

thread-safe ли? - C++

Восстановить пароль Регистрация
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
27.08.2013, 07:38     thread-safe ли? #1
Насколько я понимаю, для х32 процессоров атомарными операциями не являются те, что с double/long long, для х64 же и они атомарны. Если я прав, то будет ли thread-safe данная ситуация на х32:
Имеем глобальную переменную long long-типа, скажем X. Она инициализирована 23 по умолчанию. Имеем два потока потока с while(true):
- один производит некоторые вычисления, используя значения этой переменной, не меняя её при этом;
- второй каждый раз присваиваем X число 23, не используя его больше нигде.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
long long X = 23;
...
/*thread1*/
void t1(void* param)
{
...
if (X == 23)
{
// do something
}
}
...
/*thread2*/
void t2(void* param)
{
...
X = 23;
...
}
А может, она даже на х64 не будет thread-safe?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2013, 07:38     thread-safe ли?
Посмотрите здесь:

C++ std::thread
Thread class C++
Секундомер и thread-safe C++
библиотека thread C++
C++ Thread-safe ли чтение структур?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alexcoder
1438 / 652 / 86
Регистрация: 03.06.2009
Сообщений: 3,295
Завершенные тесты: 1
27.08.2013, 08:31     thread-safe ли? #2
ИМХО, атомарность операции не гарантируется.
Кроме того, даже в коде для x32
C++
1
2
int x=23;
x++;
может быть не атомарной!
компилятор не гарантирует компиляцию этой команды в
Assembler
1
inc [x]
вполне может быть сгенерирован код
Assembler
1
2
3
mov eax,[x]
add eax,1
mov [x],eax
Пруфы в интернете были с разбором данной ситуации.
Думаю аналогичная ситуация складывается и с х64. Повторяю, ИМХО.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.08.2013, 09:02     thread-safe ли? #3
да, нигде в стандарте не описано что операции с этими типами атомарны.
можно попробовать std::atomic<long long>::is_lock_free. Раз без блокировок - значит
операции атомарно выполняются. Но 100% гарантии что это именно так я дать не могу.
Нужно в доках инфу искать.
Если вы будете работать с std::atomic<xxx> - то должно быть thread-safe.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
27.08.2013, 09:09     thread-safe ли? #4
Цитата Сообщение от DU Посмотреть сообщение
да, нигде в стандарте не описано что операции с этими типами атомарны
Зато в стандарте описано, что отсутствие синхронизации при доступе к разделяемому ресурсу есть неопределенное поведение
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
27.08.2013, 09:53  [ТС]     thread-safe ли? #5
alexcoder, DU, fasked, окей, тогда если вернуться к начальному вопросу, то будет ли атомарность в данном случае? Ведь по сути, даже если операция не атомарна, X нигде не меняется (оно было равно 23, так и пишут в неё 23)?
Убежденный
Системный программист
 Аватар для Убежденный
14213 / 6228 / 988
Регистрация: 02.05.2013
Сообщений: 10,385
Завершенные тесты: 1
27.08.2013, 10:03     thread-safe ли? #6
Цитата Сообщение от nexen Посмотреть сообщение
- один производит некоторые вычисления, используя значения этой переменной, не меняя её при этом;
- второй каждый раз присваиваем X число 23, не используя его больше нигде.
В чем смысл ? Значение переменной не меняется, выходит и конкуренции за нее нет.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
27.08.2013, 10:22  [ТС]     thread-safe ли? #7
Убежденный, опустил смысл, чтобы вникать не нужно было и привел лишь то, в чем вопрос.
А значение переменной меняется, просто на то же самое. А так как присваивание, как сказали мсье выше, не гарантировано атомарная операция, то.. Да и тут long long на x32, точно не атомарная
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
27.08.2013, 12:45     thread-safe ли? #8
Цитата Сообщение от nexen Посмотреть сообщение
Да и тут long long на x32, точно не атомарная
Не надо так сразу тоже... Есть simd инструкции, есть cmpxchg8b.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2013, 15:40     thread-safe ли?
Еще ссылки по теме:

C++ Boost::thread vs std::thread
C++ Thread в объекте
Vector и thread-safe C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Убежденный
Системный программист
 Аватар для Убежденный
14213 / 6228 / 988
Регистрация: 02.05.2013
Сообщений: 10,385
Завершенные тесты: 1
27.08.2013, 15:40     thread-safe ли? #9
Цитата Сообщение от nexen Посмотреть сообщение
Да и тут long long на x32, точно не атомарная
В данном случае это не имеет никакого значения.
Yandex
Объявления
27.08.2013, 15:40     thread-safe ли?
Ответ Создать тему
Опции темы

Текущее время: 03:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru