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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

thread-safe ли? - C++

27.08.2013, 07:38. Просмотров 538. Ответов 8
Метки нет (Все метки)

Насколько я понимаю, для х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++):

Vector и thread-safe - C++
Как лучше сделать свой класс типа контейнер шаблонный как вектор который будет ещё и thread-safe. Допустим есть обычный класс внутри вектор...

Секундомер и thread-safe - C++
В моей программе мне нужно отслеживать время по секундам. Я сделал следующее: создал доп. поток, в котором вызывается методом с телом: ...

Thread-safe ли чтение структур? - C++
Собственно, безопасно ли нескольким потокам одновременно читать значение глобальной переменной, если она не влазит в примитивный тип?

Что такое thread safe? - C++
Всем добрый день! Вопрос, собственно, в имени темы.:) Что это такое? Я так понимаю, что переменная не меняет значения при...

Thread-safe smart pointer - C++
Нужно мне это для реализации COW механизма. В STL, насколько я понимаю, shared_ptr такого не может дать. Однако, покопавшись в...

Ошибка компиляции "no instance of constructor 'std::thread::thread' matches the argument list" - C++
Не могу сообразить почему возникает ошибка. У меня в классе есть метод, который должен работать в нескольких потоках одновременно. Вот он: ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alexcoder
1463 / 677 / 89
Регистрация: 03.06.2009
Сообщений: 3,558
Завершенные тесты: 1
27.08.2013, 08:31 #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
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.08.2013, 09:02 #3
да, нигде в стандарте не описано что операции с этими типами атомарны.
можно попробовать std::atomic<long long>::is_lock_free. Раз без блокировок - значит
операции атомарно выполняются. Но 100% гарантии что это именно так я дать не могу.
Нужно в доках инфу искать.
Если вы будете работать с std::atomic<xxx> - то должно быть thread-safe.
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.08.2013, 09:09 #4
Цитата Сообщение от DU Посмотреть сообщение
да, нигде в стандарте не описано что операции с этими типами атомарны
Зато в стандарте описано, что отсутствие синхронизации при доступе к разделяемому ресурсу есть неопределенное поведение
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
27.08.2013, 09:53  [ТС] #5
alexcoder, DU, fasked, окей, тогда если вернуться к начальному вопросу, то будет ли атомарность в данном случае? Ведь по сути, даже если операция не атомарна, X нигде не меняется (оно было равно 23, так и пишут в неё 23)?
Убежденный
Системный программист
Эксперт С++
15512 / 7010 / 1108
Регистрация: 02.05.2013
Сообщений: 11,442
Завершенные тесты: 1
27.08.2013, 10:03 #6
Цитата Сообщение от nexen Посмотреть сообщение
- один производит некоторые вычисления, используя значения этой переменной, не меняя её при этом;
- второй каждый раз присваиваем X число 23, не используя его больше нигде.
В чем смысл ? Значение переменной не меняется, выходит и конкуренции за нее нет.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
27.08.2013, 10:22  [ТС] #7
Убежденный, опустил смысл, чтобы вникать не нужно было и привел лишь то, в чем вопрос.
А значение переменной меняется, просто на то же самое. А так как присваивание, как сказали мсье выше, не гарантировано атомарная операция, то.. Да и тут long long на x32, точно не атомарная
Somebody
2788 / 1602 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
27.08.2013, 12:45 #8
Цитата Сообщение от nexen Посмотреть сообщение
Да и тут long long на x32, точно не атомарная
Не надо так сразу тоже... Есть simd инструкции, есть cmpxchg8b.
Убежденный
Системный программист
Эксперт С++
15512 / 7010 / 1108
Регистрация: 02.05.2013
Сообщений: 11,442
Завершенные тесты: 1
27.08.2013, 15:40 #9
Цитата Сообщение от nexen Посмотреть сообщение
Да и тут long long на x32, точно не атомарная
В данном случае это не имеет никакого значения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2013, 15:40
Привет! Вот еще темы с ответами:

C++11. thread, mutex, thread-safety - C++
есть функция, которая стартует 2 потока: для отлова нажатия клавиш и для выполнения действий void Trainer::start() { const HANDLE...

Boost::thread vs std::thread - C++
Доброго времени суток, решил углубить свои знания, и решил почитать про потоки, бустовые и те что в 11 стандарте приняли, с бустом все ясно...

Thread - C++
Доброго времени суток господа! Вопрос в коде в комментариях. #include &lt;iostream&gt; #include &lt;thread&gt; enum { DELAY = 5 }; bool...

Thread в объекте - C++
Добрый вечер, вопрос следующий: Создать класс, реализующий функционал создания/остановки нити исполнения, ошибка: cannot convert...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.08.2013, 15:40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru