|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Я прошу прощения, компилировать не буду, могу в синтаксисе ошибиться. Но суть будет понятна. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Вопрос: является ли приложение потокобезопасным? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 18:23 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petravявляется ли приложение потокобезопасным? В данном приложении всего один поток, так что, да, оно потокобезопасное за отсутствием многопоточности. Было бы потоков больше - пришлось бы обсуждать последствия возможного получения не тех значений, которые ожидались. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 18:29 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Почему один поток? Я же создаю объект потока... Не, чисто технически оно могло бы выродится в однопоточное, но я не представляю как оптимизатор мог бы так лихо отработать. PS: Я немного доработал первый пост. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 18:34 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav Почему один поток? Потому что первый поток стоит и совсем ничего не делает пока не завершится второй. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 18:36 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petrav Почему один поток? Потому что первый поток стоит и совсем ничего не делает пока не завершится второй. Да, но как у нас там? У ядер процессора свой/личный кэш верхнего уровня. У каждого потока свой набор регистров (сохраняемый в контексте потока). Каким образом они тут синхронизированы? И синхронизированы ли? В данном коде. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 18:43 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petravУ ядер процессора свой/личный кэш верхнего уровня. У каждого потока свой набор регистров (сохраняемый в контексте потока). И всё это совершенно не влияет на ответ: в данной программе одновременно работает только один поток, она не многопоточная. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 18:46 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav Dimitry Sibiryakov пропущено... Потому что первый поток стоит и совсем ничего не делает пока не завершится второй. Да, но как у нас там? У ядер процессора свой/личный кэш верхнего уровня. У каждого потока свой набор регистров (сохраняемый в контексте потока). Каким образом они тут синхронизированы? И синхронизированы ли? В данном коде. В кэш других потоков оно попасть не успело ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 18:47 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravУ ядер процессора свой/личный кэш верхнего уровня. У каждого потока свой набор регистров (сохраняемый в контексте потока). И всё это совершенно не влияет на ответ: в данной программе одновременно работает только один поток, она не многопоточная. А если я сейчас соберу эту программу и в Process Explorer увижу два потока? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 18:49 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petravА если я сейчас соберу эту программу и в Process Explorer увижу два потока? Увидишь. Но толку-то?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 18:57 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravА если я сейчас соберу эту программу и в Process Explorer увижу два потока? Увидишь. Но толку-то?.. Представим себе предположительное исполнение потоков. Условие: потоки исполняются на разных ядрах и регистры у них, понятно, разные. Поток main(): - Увеличил значение "aaa" до двух и сохранил это в своём контексте (регистре). - Запустил поток doWork(). - Вывел на печать значение "aaa" сохранённое в контексте этого потока. Т.е. два! Поток doWork(): - Увеличил значение "aaa" до двух и сохранил это в своём контексте (регистре). - И потерял значение. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 19:03 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav Вопрос: является ли приложение потокобезопасным? Является 100% ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 19:07 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petravПредставим себе предположительное исполнение потоков. Ну представили. Да, такое возможно. А дальше-то что? Наличие гонок потоков не делает код потокоопасным если результат этих гонок никого не волнует. Ну а если волнует, тогда да: atomic_int тебе в руки. В некоторых случаях можно и volatile обойтись. А в некоторых - нужна критическая секция/мутекс. "Каждый выбирает по себе." (с) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 19:11 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravПредставим себе предположительное исполнение потоков. Ну представили. Да, такое возможно. А дальше-то что? Если такое возможно, то приложение не потокобезопасно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 19:16 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Обычно спрашивают, я вляется ли класс или метод потокобезопасным.. То есть можно ли их поместить в поток безопасно. Но у Сишников наверно все по другому) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 19:18 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petravЕсли такое возможно, то приложение не потокобезопасно. В таком случае Ваше определение "потокобезопасности приложения" - В СТУДИЮ!!! Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 19:21 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravЕсли такое возможно, то приложение не потокобезопасно. В таком случае Ваше определение "потокобезопасности приложения" - В СТУДИЮ!!! Сейчас вспомню определение из документации Boost... Приложение корректно с точки зрения многопоточности при одновременном выполнении следующих условий: - Отсутствие гонок потоков. - Отсутствие dead lock. - Отсутствие priority failures. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 19:26 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Является 100% Я передумал. Не 100%. join() - это явная синхронизация, так что на выходе из потока все ок. А вот тут место вызывающее вопросы. Код: plaintext 1. 2.
aaa не volatile так что технически компилятор имеет право хранить результат ++aaa в регистре в момент создания потока. Так что поток может увидеть старое значение. На практике этого скорее всего не происходит. А может где-то даже в стандарте описано что конкретно должно происходить - лень искать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 19:32 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
А так же компилятору дозволяется менять порядок вычисления всего что до join(). Так что ++ может вообще еще не произойти к моменту создания потока. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 19:35 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky А так же компилятору дозволяется менять порядок вычисления всего что до join(). Так что ++ может вообще еще не произойти к моменту создания потока. Моё мнение: в данном случае компилятору предписывается выполнить всё что перед функцией создания потока. Там у этой функции должен быть атрибут заставляющий компилятор вычислить всё что до функции создания потока. Конечно, этот атрибут компиляторо-зависимый. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 19:46 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Anatoly Moskovsky Является 100% Я передумал. Не 100%. Окей, спасибо. :) Anatoly Moskovsky join() - это явная синхронизация, так что на выходе из потока все ок. С чего бы тут всё окей? Anatoly Moskovsky aaa не volatile так что технически компилятор имеет право хранить результат ++aaa в регистре в момент создания потока. Так что поток может увидеть старое значение. Давайте всё же считать что "volatile" вообще не имеет никакого отношения к потокобезопасности. Я предлагаю своё видение работы потока main(): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 19:54 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav, > Сейчас вспомню определение = смешно. Ты не вспоминай. Ты ссылку дай. Взлослый же наверно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 19:59 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav ++aaa; std::thread(doWork).join(); std::cout << aaa; Вопрос: является ли приложение потокобезопасным? Я думаю что да. Хотя у вас два потока, основной останавливается на join подождать окончания второго, не производя никакой работы. Обращение к переменной происходит в строгой очередности, что должно дать предсказуемый результат "3" при любом раскладе. Многопроцессорная архитектура (симметричный вариант, к которому мы привыкли) проектируется таким образом, чтобы ваша программа исполнилась одинаково даже если второй поток произошел на другом ядре. Многопоточное программирование было бы намного сложнее без таких гарантий. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 20:08 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav Давайте всё же считать что "volatile" вообще не имеет никакого отношения к потокобезопасности. Имеет. Но начиная с С++11 там все равно UB. petrav Внутри ОС-зависимый вызов функции создания потока. Этот вызов гарантирует сброс всех регистров в кеш ядра процессора. Потом гарантируется полный барьер памяти. Ну это вы описываете как должно быть по логике. Но в стандарте с++ например то что join синхронизирует потоки описано явно, а про создание потока - нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 20:10 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav Я прошу прощения, компилировать не буду, могу в синтаксисе ошибиться. Но суть будет понятна. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Вопрос: является ли приложение потокобезопасным? Если внимательно посмотреть, то данный код аналогичен этому Код: plaintext 1. 2. 3. 4. 5. 6.
Если все так, то отрвать руки тому кто так написал. Если не так, то приводить надо адекватные примеры, а не задавать провокационные вопросы на примере кривого кода. PS Конкретно тут сработает правильно, но так писать нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 20:57 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Dima T Если все так, то отрвать руки тому кто так написал. Если не так, то приводить надо адекватные примеры, а не задавать провокационные вопросы на примере кривого кода. Вопрос совершенно корректный. Код, понятно, упрощённая модель боевого кода. Пример адекватный. Есть что сказать по теме? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 21:04 |
|
|
start [/forum/topic.php?fid=57&fpage=6&tid=2017320]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 10ms |
total: | 142ms |
0 / 0 |