Котовчанин
|
|
1 | |
Что такое thread safe?01.02.2017, 15:43. Показов 10414. Ответов 44
Метки нет (Все метки)
Всем добрый день!
Вопрос, собственно, в имени темы. Что это такое? Я так понимаю, что переменная не меняет значения при изменении потоков? Всегда плавала в этой теме. И какие есть способы сохранить переменную? Заранее спасибо
1
|
01.02.2017, 15:43 | |
Ответы с готовыми решениями:
44
thread-safe ли? Vector и thread-safe Секундомер и thread-safe Thread-safe smart pointer |
01.02.2017, 20:34 | 21 |
Это не глупость, а ровно истина. Переменная ID глобальная и по смыслу обладает свойством, что каждый поток должен с ней работать строго по очереди. Это достигается при помощи запирания и отпирания мьютекса. При этом ВСЯ работа с этой переменной должна быть внутри этой области (которая по умному называется "критическая секция")
Внутри каждого потока нужно сгенерировать какую-нибудь величину (например, rand'ом). А затем через общую функцию, вызываемую в процессе исполнения потока, просуммировать все значения. По завершении всех потоков распечатать результат
4
|
Неэпический
|
|
01.02.2017, 20:35 | 22 |
1
|
Форумчанин
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 | |||||
нет, здесь всё в порядке.
единственное: использовать мутекс в данном примере - нерационально. если так приспичело локать/анлокать, то лучше использовать спинлок (в стандартной либе его нет. но он элементарно велосипедится стандартными средствами. если хотите - могу подкинуть готовый образчик) ну кроме того, конкретно в этом примере вообще не нужны ни мутексы, ни спинлоки. лучше всего для этой задачи подойдет std::atomic можно сделать вот так вот:
причем на большинстве платформ, std::atomic<int> вообще вроде как оптимизирован, и не использует блокировку.
3
|
01.02.2017, 21:15 | 26 |
C ID++; return ID; А по части обучения - в очередной раз выскажусь на тему того, что сначала надо изучать матчасть, а потом пользоваться всякими плюшками от Си++ и прочих монстров
1
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
18.02.2018, 07:17 | 27 |
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.
Весьма вероятно, что хороший прирост скорости. С мьютексом тоже 2 опрерации: инкремент (под мьютексом) и копирование данных в вызывающую сторону (без мьютекса).
0
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
18.02.2018, 13:27 | 32 |
0
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
18.02.2018, 14:36 | 34 |
Мне банально влом разжёвывать матчасть, которая уже разжёвана, например, на том же stackoverflow.
А вот послушать аргументы почему код, про который известно, что он корректный, работает неправильно, это всегда любопытно.
0
|
18.02.2018, 15:05 | 35 |
Ага. Это особенно актуально, когда написано про красные треугольники, а ты начинаешь рассказывать про зелёные квадраты. Есть русскоязычный аналог - слышу звон, но не знаю, где он
Ну так читай тему с самого начала. Или тоже банально влом?
0
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
18.02.2018, 15:19 | 37 |
Уже читал. Обсуждается в основном оригинальное задание - обеспечить синхронизацию мьютексом. Я не спорю, что там всё верно и мьютексом можно.
Чёрт с оригинальным заданием, мы обсуждаем std::atomic + return ID++; . Как тут поможет чтение треда? Получается классическая ситуация, когда обсуждаются красные треугольники, а меня отправляют читать про зелёные квадраты.
0
|
18.02.2018, 15:21 | 38 |
Если хочешь обсудить что-то другое, лежащее вне темы обсуждения данной темы, заведи отдельную тему и обсуждай. Только не забудь внятно написать, что конкретно ты обсуждаешь
Добавлено через 1 минуту Не по теме: Не по-русски выразился, ну да ладно, вроде бы смысл ясен
0
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
||||||
18.02.2018, 20:01 | 39 | |||||
Тема обсуждения "Что такое thread safe?", так что это лежит в теме обсуждения.
А из того, что я цитироват ответ на сообщение hoggy, который предложил std::atomic , было неясно, про что мы говорим?Добавлено через 4 часа 35 минут В общем, я так понял, к корректности кода
0
|
18.02.2018, 20:21 | 40 |
Похоже на то. В принципе, так оно обычно и бывает, когда стороны начинают на ровном месте заниматься выяснением отношений
Что касается последнего твоего примера из поста #39, то, вероятно, это должно спасти ситуацию, но не уверен. Вот тут http://en.cppreference.com/w/cpp/atomic/atomic нет внятного описания, что делает оператор ++. Рядом описан метод fetch_add, по описанию он и выполняет то, что нужно. Если посмотреть на препроцессированный файл из-под g++, то оператор ++ реализован в виде fetch_add(1), т.е. как бы делает то, что нужно Поэтому если в стандарте оператор ++ описан именно так, то такая реализация будет корректной. Правда перед ТС'ом была поставлена другая задача, но не суть
0
|
18.02.2018, 20:21 | |
18.02.2018, 20:21 | |
Помогаю со студенческими работами здесь
40
Thread-safe ли чтение структур? что такое process и thread? Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами? Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |