|
Небольшой вопрос про 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 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav Код: plaintext 1. 2. 3. 4. 5. 6. 7.
это оптимизатор может превратить в это Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 21:04 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Dima T petrav Код: plaintext 1. 2. 3. 4. 5. 6. 7.
это оптимизатор может превратить в это Код: plaintext 1. 2. 3. 4. 5. 6.
Давно прораммируете? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 21:06 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav Давно прораммируете? Давно. А ты в асме не умеешь смотреть что на самом деле происходит? Там прекрасно все видно: осталось значение в регистре или обратно в память вернулось. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 21:17 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Dima T petrav Давно прораммируете? Давно. А ты в асме не умеешь смотреть что на самом деле происходит? Там прекрасно все видно: осталось значение в регистре или обратно в память вернулось. В данном случае это вредное искусство. Код должен быть осмысленным, независимым от компилятора, от процессора, от ОС, логичным. Совершенно не важно что там в асме. В асм нужно смотреть только в кардинальных проблемах, которые подсвечивает профайлер. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 21:21 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav Код должен быть осмысленным, независимым от компилятора, от процессора, от ОС Во-вторых, произвольный код не может удовлетворять всем этим ограничениям - только "специально приготовленный". И вот тут-то может оказать необходимым смотреть машинный код разных компиляторов и, возможно, на разных платформах. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 21:44 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Basil A. Sidorov petrav Код должен быть осмысленным, независимым от компилятора, от процессора, от ОС Во-вторых, произвольный код не может удовлетворять всем этим ограничениям - только "специально приготовленный". И вот тут-то может оказать необходимым смотреть машинный код разных компиляторов и, возможно, на разных платформах. И всё же предлагаю вернуться к теме топика. А то мы тут все пообсуждать мастаки. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 21:47 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
32.4.2.2 Class thread Constructors thread(F&& f, Args&&... args); 7. Synchronization: The completion of the invocation of the constructor synchronizes with the beginning of the invocation of the copy of f. 32.4.2.5 Class thread Membersvoid join(); 4. Synchronization: The completion of the thread represented by *this synchronizes with (6.9.2) the corresponding successful join() return. "synchronizes with" это release+acquire barrier. Другими словами, создание потока является точкой синхронизации с родительским потоком, как и join. Так что все изменения произведенные перед созданием потока в глобальных переменных (и прочих видимых в других потоках) становятся видимыми для созданного потока, так же как изменения сделанные потоком становятся видимыми родителю после join. Так что мой ответ снова Является 100% )) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 21:57 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petravпредлагаю вернуться к теме топика. Не к чему возвращаться. Не существует понятия "потокобезопасное приложение". Потокобезопасным может быть только функция или метод класса и определение этой "безопасность" базируется на нежеланных различиях результата работы при последовательных вызовах из одного потока и параллельных из нескольких. Функция ГПСЧ, например, может творить любую дичь внутри и всё равно быть потокобезопасной, поскольку у неё в любом случае непредсказуемый результат. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 22:08 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav, авторПоток doWork(): - Увеличил значение "aaa" до двух и сохранил это в своём контексте (регистре). - И потерял значение. Вы беспокоитесь что поток завершится слишком быстро, и забудет обновить значение глобальной переменной? Напрасно. Программная модель C/C++ обеспечивает данный контракт. Вы дали указание программе изменить значение глобальной переменной, эта переменная будет правильно изменена. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 23:04 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Подобный код обычно задают на собесах. И спрашивают что здесь происходит. Еще хуже если в код превносят гонки за состояниями. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
С организационной точки зрения вроде-бы все ОК. Но потоки должны выполнять работу в параллелизме. И эту опцию надо продемонстрировать. В данном примере двух-поточное приложение имеет место и должно работать. Но опция - никак себя не проявила. И если следующая эквивалентная трансформация дает тот-же эффект Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
то собеседующий может спросить к примеру - а зачем? Это - ошибка проектирования? Или троллинг? Я к чему это все. Когда вы хотите поговорить про кеши или скажем про кванты планировщика (которые будут иметь место в 1 варианте) то вы должны хотя-бы постараться принести в форум нечто РАСКРЫВАЮЩЕЕ возможности std::thread. Не ходя далеко - процессинг группы файлов например. Или рендеринг картинки частями. Это как драйв тест машины. Вы-же хотите "давануть" на газ чтоб послушать как звучит ваш новый ДВС или дизель. Так будьте-же вы инженером чьорт вас подери. Зачем детские примеры кидать? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 23:17 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav Basil A. Sidorov пропущено... Во-первых - утопия. Во-вторых, произвольный код не может удовлетворять всем этим ограничениям - только "специально приготовленный". И вот тут-то может оказать необходимым смотреть машинный код разных компиляторов и, возможно, на разных платформах. И всё же предлагаю вернуться к теме топика. А то мы тут все пообсуждать мастаки. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 23:44 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
НеофитSQL petrav, авторПоток doWork(): - Увеличил значение "aaa" до двух и сохранил это в своём контексте (регистре). - И потерял значение. Вы беспокоитесь что поток завершится слишком быстро, и забудет обновить значение глобальной переменной? Напрасно. Программная модель C/C++ обеспечивает данный контракт. Вы дали указание программе изменить значение глобальной переменной, эта переменная будет правильно изменена. Я не мыслю в терминах "слишком быстро завершится потому". Это как доказательство математической теоремы: ситуация такая, потому что, теоремы-аксиомы и ч.т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2020, 23:58 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
mayton Так будьте-же вы инженером чьорт вас подери. Зачем детские примеры кидать? Это не детские примеры. Это нетривиальные примеры. Которые, вы, майтун, не можете решить. У вас на это просто не хватит квалификации. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 00:03 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav mayton Так будьте-же вы инженером чьорт вас подери. Зачем детские примеры кидать? Это не детские примеры. Это нетривиальные примеры. Которые, вы, майтун, не можете решить. У вас на это просто не хватит квалификации. Знаешь, есть выражение о том что один чудак может 100 мудрецов ушатать вопросами? Давай свои вопросы. Про кеши и прочее. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 00:13 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav, Резонный подход, неудачный пример. Вы спрашиваете, а не выпуклая ли в плоскость в евклидовой системе. Ответ - кривизна плоскости в евклидовой системе равна нулю, по определению выбранной системы. Так и тут - выбрав язык с++, вы приняли программную модель языка, где изменение значения переменной в вашем примере ее изменит. С точки зрения программы и программиста. Если нет внешних ссылок, оптимизатор может многое выкинуть и распечатать тройку из константы. Программная модель определяет видимое поведение программы, а не эффект ее на кэш, процессор, память или qbits. Поэтому ваша программа, которая не нарушает правил языка и не затрагивает области неопределенного поведения, выполнится с одинаковым наблюдаемым результатом на любом компьютере с исправным компилятором. Я собирался оговорить "где int длиннее двух битов", но это уже и так оговорено в стандарте. Можно разобрать пример вне С++, вы знаете ассемблер? Там нет вышеупомянутых гарантий. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 00:14 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
mayton petrav пропущено... Это не детские примеры. Это нетривиальные примеры. Которые, вы, майтун, не можете решить. У вас на это просто не хватит квалификации. Знаешь, есть выражение о том что один чудак может 100 мудрецов ушатать вопросами? Давай свои вопросы. Про кеши и прочее. Мой вопрос задан в первых постах. Просто и ясно. Точно так же ясный вопрос могут ушатать двадцать *удаков. Знакомо да? Вы же этим занимаетесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 00:20 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
По первому вопросу тебе уже ответили. Я не хочу повторять про потоко-безопасность. Вопрос был безсмыслицей. Но если я тебя лично чем то обидел - извини. Не буду сюда писать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 00:33 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
mayton По первому вопросу тебе уже ответили. Я не хочу повторять про потоко-безопасность. Вопрос был безсмыслицей. Вопрос был спорным. Очень проблемным. И ты существуешь в мире где такие вопросы не существуют. В твоём мире они решены. mayton Но если я тебя лично чем то обидел - извини. Не буду сюда писать. Спасибо, лучше не писать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 00:39 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky aaa не volatile так что технически компилятор имеет право хранить результат ++aaa в регистре в момент создания потока. Так что поток может увидеть старое значение. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 01:59 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 02:15 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
У ТС несомненно занимательная история с этим вопросом. Похоже, его кто-то подловил на этом простом примере, и успешно убедил используя малознакомые слова что в сях везде опасность. Человек пришел похвастаться новыми знаниями и подловить бывалых, но тут он себя почувствовал в дураках повторно. Я могу посочувствовать; когда мне было 12 лет меня поймали вопросом "что тяжелее, тонна железа или тонна дерева". На следующий день "словил" крутой загадкой учителя физики. Мое ликование было кратковременным, когда он объяснил что у них разный вес. Хороший был урок, не повторять (тем более защищать) чужие глупости. Своих всегда хватает. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 02:30 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
НеофитSQL Я могу посочувствовать; когда мне было 12 лет меня поймали вопросом "что тяжелее, тонна железа или тонна дерева". На следующий день "словил" крутой загадкой учителя физики. Мое ликование было кратковременным, когда он объяснил что у них разный вес. Хороший был урок, не повторять (тем более защищать) чужие глупости. Своих всегда хватает. И что у тонны железа и у тонны дерева действительно разный вес? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 02:39 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav, Несомненно. Тонна + это единица массы, вес - единица силы. Дерево легче на произведение положительной разницы объемов на плотность атмосферы. В вакууме легче, тк влага начнет испаряться Вам нравятся такие задачки? У вас впереди много удовольствия. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 02:53 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
rdb_dev petrav Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
В этом и был начальный вопрос. Осталось переписать исходный код так что бы он был потокобезопасным. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 03:02 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
НеофитSQL petrav, Несомненно. Тонна + это единица массы, вес - единица силы. Дерево легче на произведение положительной разницы объемов на плотность атмосферы. В вакууме легче, тк влага начнет испаряться Вам нравятся такие задачки? У вас впереди много удовольствия. Ну, да, я ошибся. Но таких задачек я нарешался в школе. Что там было Перельман. Я может ошибся. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 03:07 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav В этом и был начальный вопрос. Осталось переписать исходный код так что бы он был потокобезопасным. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 03:29 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav rdb_dev пропущено... В стандарте ничего не сказано о барьерах памяти до конструктора std::thread и после join(). Сказано лишь, что join() блокирует вызывающий поток до тех пор, пока вызванный поток, представленный в join() как *this не завершит свою работу. Поэтому не стоит полагаться на то, что mfence будет как внутри вызванного потока перед его завершением, так и после продолжения работы вызывающего потока. В этом и был начальный вопрос. Осталось переписать исходный код так что бы он был потокобезопасным. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 03:36 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Чуть усложним алгоритм... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 04:47 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Стабильная утрата одного из двух изменений значения Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
Результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Data race... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 05:50 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
rdb_dev Чуть усложним алгоритм... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Казалось бы, изменение значения "++aaa" после "std::thread th(doWork)" должно теряться, но этого не происходит. Возможно, реализация sleep_for() имеет недокументированный побочный эффект в виде барьера памяти. Создание потока далеко не бесплатная операция, если не путаю там порядка 1000-2000 тактов процессорных тратится, потому если хочешь чтобы синхронно заработал код в новом потоке - надо их синхронизировать, т.е. дождаться инициализации потока. Хотя и это не поможет, т.к. "++aaa" легкая операция, пара тактов. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 08:20 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Dima T Создание потока далеко не бесплатная операция, если не путаю там порядка 1000-2000 тактов процессорных тратится, потому если хочешь чтобы синхронно заработал код в новом потоке - надо их синхронизировать, т.е. дождаться инициализации потока. Хотя и это не поможет, т.к. "++aaa" легкая операция, пара тактов. Не очень понятно почему вы рассуждаете в терминах каких-то задержек, тактов процессора и т.д. Я предлагаю рассуждать в терминах математической корректности, в терминах денег, жизней людей и личной подсудности. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 09:34 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
rdb_dev Чуть усложним алгоритм... volatile int aaa; Поясните плиз: зачем вы использовали volatile? Запрет на кеширование значения переменной не имеет ничего общего с потокобезопасностью. Ваш код откровенно некорректный и вы делаете из него какие-то выводы. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 09:59 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
rdb_dev petrav В этом и был начальный вопрос. Осталось переписать исходный код так что бы он был потокобезопасным. Так, что в голову взбредет. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 10:57 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav mayton По первому вопросу тебе уже ответили. Я не хочу повторять про потоко-безопасность. Вопрос был безсмыслицей. Вопрос был спорным. Очень проблемным. И ты существуешь в мире где такие вопросы не существуют. В твоём мире они решены. mayton Но если я тебя лично чем то обидел - извини. Не буду сюда писать. Спасибо, лучше не писать. ТС Вопросы в топике без отсылки к документации о том что является Thread-safe являются флудом ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 11:00 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav rdb_dev Чуть усложним алгоритм... volatile int aaa; Поясните плиз: зачем вы использовали volatile? Запрет на кеширование значения переменной не имеет ничего общего с потокобезопасностью. Ваш код откровенно некорректный и вы делаете из него какие-то выводы. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 11:43 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
PetroNotC Sharp ТС Вопросы в топике без отсылки к документации о том что является Thread-safe являются флудом ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 12:03 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
rdb_dev PetroNotC Sharp ТС Вопросы в топике без отсылки к документации о том что является Thread-safe являются флудом замечательно. Теперь осмысливаем фразу авторКод потокобезопасен, если он функционирует исправно при использовании его из нескольких потоков одновременно. и сравниваем с тем что автор ТС спрашивает? )))) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 12:25 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
rdb_dev, он не понимает разницы между "обособленном коде" и словом "Программа" ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 12:27 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
тьфу, ещё хуже - "Приложение" ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 12:27 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
rdb_dev, То есть если на пальцах. Гипсокартон влагоустойчив только при проверке его методом погружения во влажную среду. Куда мы погружаем "Приложение" непонятно) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 12:31 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
rdb_dev petrav пропущено... Поясните плиз: зачем вы использовали volatile? Запрет на кеширование значения переменной не имеет ничего общего с потокобезопасностью. Ваш код откровенно некорректный и вы делаете из него какие-то выводы. Я, конечно, прочитал это ваше сообщение. Там как раз вы и поясняете почему волотайл не имеет ничего общего с многопоточностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 12:36 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav, почему же не имеет? Как раз имеет! В программе, где все значения переменных зависят только от действий логики программы в одном - основном потоке, в volatile попросту нет смысла. Зачем в однопоточной программе ставить барьер для оптимизации компилятора в отношении какой-то переменной? Бессмыслица какая-то... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 13:01 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
НеофитSQLДерево легче на произведение положительной разницы объемов на плотность атмосферы. Но при этом школьная формула веса это P = mg. Буква V в ней отсутствует. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 13:07 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
rdb_dev petrav, почему же не имеет? Как раз имеет! В программе, где все значения переменных зависят только от действий логики программы в одном - основном потоке, в volatile попросту нет смысла. Зачем в однопоточной программе ставить барьер для оптимизации компилятора в отношении какой-то переменной? Бессмыслица какая-то... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 13:22 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov НеофитSQLДерево легче на произведение положительной разницы объемов на плотность атмосферы. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 16:23 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Определение "веса" однозначно: это сила, равная реакции опоры, но противоположная ей по направлению. В школьную формулу этой силы объём не входит. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 16:26 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
мои 5 коп. в тему)) речь об Архимедовой силе, в деревяшке объём больше (не знаю как в железном дереве). - А вы знаете, - сказал Остап Бендер, - на каждого из нас давит столб воздуха весом в 2 с половиной кило. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 17:51 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Определение "веса" однозначно: это сила, равная реакции опоры, но противоположная ей по направлению. В школьную формулу этой силы объём не входит. Воздух с одной силой выталкивает, вода с другой, можно еще в ртути попробовать утопить. Если те же вещи в вакууме проверить, то сила поменяется. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 20:57 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
petrav Dima T Создание потока далеко не бесплатная операция, если не путаю там порядка 1000-2000 тактов процессорных тратится, потому если хочешь чтобы синхронно заработал код в новом потоке - надо их синхронизировать, т.е. дождаться инициализации потока. Хотя и это не поможет, т.к. "++aaa" легкая операция, пара тактов. Не очень понятно почему вы рассуждаете в терминах каких-то задержек, тактов процессора и т.д. Это был маленький оффтоп для rdb_dev petrav Я предлагаю рассуждать в терминах математической корректности, в терминах денег, жизней людей и личной подсудности. Хрень какая. У каждой проги в лицензии написано "as is", в перевода на русский "кому должен всем прощаю" Стандарт С/С++ пишется с оглядкой на возможности железа, он не для сферического вакуума, поэтому в основе лежат такты и задержки, с учетом их рождаются общие правила для разных типов процессоров. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 21:41 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Dima TВоздух с одной силой выталкивает, вода с другой А ещё различия в центробежной силе из-за разного положения точек тяжести. Но в пределах школьной программы это всё под плинтусом достаточной точности. Точно так же все программы в которых ничего нет между созданием потока и его завершением - однопоточны вне зависимости от того в скольких линиях кэша и ядрах процессора они обрабатываются. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 22:15 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Dima TВоздух с одной силой выталкивает, вода с другой А ещё различия в центробежной силе из-за разного положения точек тяжести. Но в пределах школьной программы это всё под плинтусом достаточной точности. Точно так же все программы в которых ничего нет между созданием потока и его завершением - однопоточны вне зависимости от того в скольких линиях кэша и ядрах процессора они обрабатываются. Эх ... . Я ребенку в 8 классе репититора нанял по алгебре/геометрии, т.к. сам затрахался узнавать их домашнее задание, а нет задания - делать нечего. Репетитор(ша) до кучи оказалась со знанием физики и физику порешали параллельно. В итоге физик сказал ребенку: "Можешь ведь", ребенок ответил "Репетитор объяснил". Вот такое нынче образование ((( ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 22:35 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Dima T petrav Не очень понятно почему вы рассуждаете в терминах каких-то задержек, тактов процессора и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 01:39 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
rdb_dev Dima T пропущено... Это был маленький оффтоп для rdb_dev Я писал 22211830 почему твой эмулятор data race не заработал. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 10:45 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Dima T, какой data race можно эмулировать в цикле на 10-ти итерациях без синхронизации по spin-lock, да ещё и при ожидании после всех изменений? Это была демонстрация побочного эффекта sleep_for и синхронизации в join(). Демонстрация data race здесь 22211827 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 15:10 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
rdb_dev, Dima T, Бессмысленно обсуждать какой должен быть результат когда есть race. Data race -это UB. Поэтому результат любой. Если как в вашем примере в двух потоках происходит модификация переменной, то это race. Что либо ожидать от такого кода нет смысла. ЗЫ. В исходном примере нет race поэтому результат там детерминированный. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 17:24 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky "synchronizes with" это release+acquire barrier. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 02:34 |
|
Небольшой вопрос про std::thread
|
|||
---|---|---|---|
#18+
a guest Anatoly Moskovsky "synchronizes with" это release+acquire barrier. release+acquire barrier это низкоуровневый механизм реализации высокоуровневой концепции "synchronizes with". Другие механизмы существуют (напр. mutex), но они все равно сводятся к release+acquire ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 14:38 |
|
|
start [/forum/topic.php?all=1&fid=57&tid=2017320]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
93ms |
get tp. blocked users: |
2ms |
others: | 273ms |
total: | 448ms |
0 / 0 |