Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/55: Рейтинг темы: голосов - 55, средняя оценка - 4.95
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
1

Что такое thread safe?

01.02.2017, 15:43. Показов 10414. Ответов 44
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем добрый день!

Вопрос, собственно, в имени темы.

Что это такое? Я так понимаю, что переменная не меняет значения при изменении потоков? Всегда плавала в этой теме.

И какие есть способы сохранить переменную?

Заранее спасибо
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2017, 15:43
Ответы с готовыми решениями:

thread-safe ли?
Насколько я понимаю, для х32 процессоров атомарными операциями не являются те, что с double/long...

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

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

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

44
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
01.02.2017, 20:34 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Тамика Посмотреть сообщение
Evg, простите, пожалуйста, но можно подробнее? Не поняла... Вы имеете в виду return ID?
Цитата Сообщение от Peoples Посмотреть сообщение
Может глупость скажу,но я так понимаю есть вероятность,что в момента return'a другой поток может поменять значение
Это не глупость, а ровно истина. Переменная ID глобальная и по смыслу обладает свойством, что каждый поток должен с ней работать строго по очереди. Это достигается при помощи запирания и отпирания мьютекса. При этом ВСЯ работа с этой переменной должна быть внутри этой области (которая по умному называется "критическая секция")

Цитата Сообщение от Тамика Посмотреть сообщение
Evg, Croessmah, GbaLog-, дайте мне, пожалуйста, какую-нибудь задачку на закрепление... А то боюсь, что сейчас что-то поняла, а через неделю забуду и не вспомню
Внутри каждого потока нужно сгенерировать какую-нибудь величину (например, rand'ом). А затем через общую функцию, вызываемую в процессе исполнения потока, просуммировать все значения. По завершении всех потоков распечатать результат
4
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
01.02.2017, 20:35 22
Цитата Сообщение от Тамика Посмотреть сообщение
будет выделяться новый адрес под эту переменную?
Угу.
И mutex можно сделать статическим, но локальным для функции.
Цитата Сообщение от Тамика Посмотреть сообщение
з.ы. а что это за Вильямс
Литература C++
1
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
01.02.2017, 20:36 23
Тамика, Энтони Уильямс - Параллельное программирование на С++ в действии. Достаточно подробно и информативно всё описывается
1
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
01.02.2017, 20:54 24
Тамика, если планируете всерьёз изучать тему по параллельному программированию, то обязательно прочтите "Параллельное программирование на С++ в действии. Практика разработки многопоточных программ". Я как раз вчера себе бумажную версию заказал, планирую перечитать.

Добавлено через 35 секунд

Не по теме:

А, блин, не заметил, что уже успели на вторую страницу нафлудить.

1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.02.2017, 21:02 25
Цитата Сообщение от Тамика Посмотреть сообщение
Здесь ведь нет опасности изменения другим потоком i?
нет, здесь всё в порядке.

единственное:
использовать мутекс в данном примере - нерационально.

если так приспичело локать/анлокать,
то лучше использовать спинлок
(в стандартной либе его нет.
но он элементарно велосипедится стандартными средствами.
если хотите - могу подкинуть готовый образчик)

ну кроме того,
конкретно в этом примере вообще не нужны ни мутексы,
ни спинлоки.

лучше всего для этой задачи подойдет std::atomic

можно сделать вот так вот:
C++
1
static std::atomic<int> ID = 0;
и мутексы можно будет вообще убрать.

причем на большинстве платформ,
std::atomic<int> вообще вроде как
оптимизирован,
и не использует блокировку.
3
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
01.02.2017, 21:15 26
можно сделать вот так вот:

C++
1
static std::atomic<int> ID = 0;
и мутексы можно будет вообще убрать.
В изначальном варианте

C
ID++;
return ID;
это не спасёт

А по части обучения - в очередной раз выскажусь на тему того, что сначала надо изучать матчасть, а потом пользоваться всякими плюшками от Си++ и прочих монстров
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
18.02.2018, 07:17 27
Цитата Сообщение от Evg Посмотреть сообщение
В изначальном варианте это не спасёт
Ну заменить на return ID++;
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
18.02.2018, 11:36 28
0
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
18.02.2018, 11:37 29
rat0r,
А что это даст? Все равно остаётся 2 операции, инкремент и копирование данных в вызывающую сторону...
И вполне возможно что после инкремента но до процесса копирования в вызывающую сторону другой поток мог бы изменить значение атомарной переменной... В итоге вернётся значение которое функция не предусматривала.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
18.02.2018, 13:22 30
Evg, да, я делаю так же, когда вижу, что кто-то городит мьютексы там, где достаточно std::atomic.

Цитата Сообщение от Undisputed Посмотреть сообщение
А что это даст?
Весьма вероятно, что хороший прирост скорости.

Цитата Сообщение от Undisputed Посмотреть сообщение
Все равно остаётся 2 операции, инкремент и копирование данных в вызывающую сторону
С мьютексом тоже 2 опрерации: инкремент (под мьютексом) и копирование данных в вызывающую сторону (без мьютекса).
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
18.02.2018, 13:24 31
Цитата Сообщение от rat0r Посмотреть сообщение
Весьма вероятно, что хороший прирост скорости
Ценой неправильной работы кода
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
18.02.2018, 13:27 32
Цитата Сообщение от Evg Посмотреть сообщение
Ценой неправильной работы кода
Any proofs?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
18.02.2018, 14:09 33
Цитата Сообщение от rat0r Посмотреть сообщение
Any proofs?
Any proofs for reverse?
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
18.02.2018, 14:36 34
Цитата Сообщение от Evg Посмотреть сообщение
Any proofs for reverse?
Мне банально влом разжёвывать матчасть, которая уже разжёвана, например, на том же stackoverflow.

А вот послушать аргументы почему код, про который известно, что он корректный, работает неправильно, это всегда любопытно.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
18.02.2018, 15:05 35
Цитата Сообщение от rat0r Посмотреть сообщение
Мне банально влом разжёвывать матчасть, которая уже разжёвана, например, на том же stackoverflow
Ага. Это особенно актуально, когда написано про красные треугольники, а ты начинаешь рассказывать про зелёные квадраты. Есть русскоязычный аналог - слышу звон, но не знаю, где он

Цитата Сообщение от rat0r Посмотреть сообщение
А вот послушать аргументы почему код, про который известно, что он корректный, работает неправильно, это всегда любопытно
Ну так читай тему с самого начала. Или тоже банально влом?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
18.02.2018, 15:07 36
del
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
18.02.2018, 15:19 37
Цитата Сообщение от Evg Посмотреть сообщение
Ну так читай тему с самого начала.
Уже читал. Обсуждается в основном оригинальное задание - обеспечить синхронизацию мьютексом. Я не спорю, что там всё верно и мьютексом можно.
Чёрт с оригинальным заданием, мы обсуждаем std::atomic + return ID++;. Как тут поможет чтение треда? Получается классическая ситуация, когда обсуждаются красные треугольники, а меня отправляют читать про зелёные квадраты.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
18.02.2018, 15:21 38
Цитата Сообщение от rat0r Посмотреть сообщение
мы обсуждаем std::atomic + return ID++;
Если хочешь обсудить что-то другое, лежащее вне темы обсуждения данной темы, заведи отдельную тему и обсуждай. Только не забудь внятно написать, что конкретно ты обсуждаешь

Добавлено через 1 минуту

Не по теме:

Не по-русски выразился, ну да ладно, вроде бы смысл ясен

0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
18.02.2018, 20:01 39
Цитата Сообщение от Evg Посмотреть сообщение
Если хочешь обсудить что-то другое, лежащее вне темы обсуждения данной темы, заведи отдельную тему и обсуждай.
Тема обсуждения "Что такое thread safe?", так что это лежит в теме обсуждения.

Цитата Сообщение от Evg Посмотреть сообщение
Только не забудь внятно написать, что конкретно ты обсуждаешь
А из того, что я цитироват ответ на сообщение hoggy, который предложил std::atomic, было неясно, про что мы говорим?

Добавлено через 4 часа 35 минут
В общем, я так понял, к корректности кода
C++
1
2
3
4
5
int GenID()
{
static std::atomic<int> ID = 0;
return ID++;
}
вопросов нет, просто не поняли, что речь шла о нём.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
18.02.2018, 20:21 40
Цитата Сообщение от rat0r Посмотреть сообщение
просто не поняли
Похоже на то. В принципе, так оно обычно и бывает, когда стороны начинают на ровном месте заниматься выяснением отношений

Что касается последнего твоего примера из поста #39, то, вероятно, это должно спасти ситуацию, но не уверен. Вот тут http://en.cppreference.com/w/cpp/atomic/atomic нет внятного описания, что делает оператор ++. Рядом описан метод fetch_add, по описанию он и выполняет то, что нужно. Если посмотреть на препроцессированный файл из-под g++, то оператор ++ реализован в виде fetch_add(1), т.е. как бы делает то, что нужно

Поэтому если в стандарте оператор ++ описан именно так, то такая реализация будет корректной. Правда перед ТС'ом была поставлена другая задача, но не суть
0
18.02.2018, 20:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2018, 20:21
Помогаю со студенческими работами здесь

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

что такое process и thread?
что такое process и thread?

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru