powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Небольшой вопрос про std::thread
82 сообщений из 82, показаны все 4 страниц
Небольшой вопрос про std::thread
    #40007063
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я прошу прощения, компилировать не буду, могу в синтаксисе ошибиться. Но суть будет понятна.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int aaa = 1;

void doWork()
{
    aaa++;
}

void main()
{
    ++aaa;
    std::thread(doWork).join();
    std::cout << aaa;
}


Вопрос: является ли приложение потокобезопасным?
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007064
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravявляется ли приложение потокобезопасным?

В данном приложении всего один поток, так что, да, оно потокобезопасное за отсутствием
многопоточности. Было бы потоков больше - пришлось бы обсуждать последствия возможного
получения не тех значений, которые ожидались.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007065
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Почему один поток? Я же создаю объект потока... Не, чисто технически оно могло бы выродится в
однопоточное, но я не представляю как оптимизатор мог бы так лихо отработать.

PS: Я немного доработал первый пост.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007066
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Почему один поток?

Потому что первый поток стоит и совсем ничего не делает пока не завершится второй.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007067
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
petrav
Почему один поток?

Потому что первый поток стоит и совсем ничего не делает пока не завершится второй.

Да, но как у нас там? У ядер процессора свой/личный кэш верхнего уровня. У каждого потока
свой набор регистров (сохраняемый в контексте потока). Каким образом они тут синхронизированы?
И синхронизированы ли? В данном коде.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007069
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravУ ядер процессора свой/личный кэш верхнего уровня. У каждого потока
свой набор регистров (сохраняемый в контексте потока).

И всё это совершенно не влияет на ответ: в данной программе одновременно работает только
один поток, она не многопоточная.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007070
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Dimitry Sibiryakov
пропущено...

Потому что первый поток стоит и совсем ничего не делает пока не завершится второй.

Да, но как у нас там? У ядер процессора свой/личный кэш верхнего уровня. У каждого потока
свой набор регистров (сохраняемый в контексте потока). Каким образом они тут синхронизированы?
И синхронизированы ли? В данном коде.

В кэш других потоков оно попасть не успело
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007072
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravУ ядер процессора свой/личный кэш верхнего уровня. У каждого потока
свой набор регистров (сохраняемый в контексте потока).

И всё это совершенно не влияет на ответ: в данной программе одновременно работает только
один поток, она не многопоточная.

А если я сейчас соберу эту программу и в Process Explorer увижу два потока?
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007074
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravА если я сейчас соберу эту программу и в Process Explorer увижу два потока?

Увидишь. Но толку-то?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007077
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravА если я сейчас соберу эту программу и в Process Explorer увижу два потока?

Увидишь. Но толку-то?..

Представим себе предположительное исполнение потоков. Условие: потоки исполняются на
разных ядрах и регистры у них, понятно, разные.

Поток main():

- Увеличил значение "aaa" до двух и сохранил это в своём контексте (регистре).
- Запустил поток doWork().
- Вывел на печать значение "aaa" сохранённое в контексте этого потока. Т.е. два!

Поток doWork():

- Увеличил значение "aaa" до двух и сохранил это в своём контексте (регистре).
- И потерял значение.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007078
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Вопрос: является ли приложение потокобезопасным?

Является 100%
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007080
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravПредставим себе предположительное исполнение потоков.

Ну представили. Да, такое возможно. А дальше-то что? Наличие гонок потоков не делает код
потокоопасным если результат этих гонок никого не волнует.

Ну а если волнует, тогда да: atomic_int тебе в руки. В некоторых случаях можно и volatile
обойтись. А в некоторых - нужна критическая секция/мутекс.

"Каждый выбирает по себе." (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007083
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravПредставим себе предположительное исполнение потоков.

Ну представили. Да, такое возможно. А дальше-то что?
Если такое возможно, то приложение не потокобезопасно.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007084
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно спрашивают, я вляется ли класс или метод потокобезопасным..
То есть можно ли их поместить в поток безопасно.
Но у Сишников наверно все по другому)
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007085
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravЕсли такое возможно, то приложение не потокобезопасно.

В таком случае Ваше определение "потокобезопасности приложения" - В СТУДИЮ!!!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007088
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravЕсли такое возможно, то приложение не потокобезопасно.

В таком случае Ваше определение "потокобезопасности приложения" - В СТУДИЮ!!!

Сейчас вспомню определение из документации Boost... Приложение корректно с точки
зрения многопоточности при одновременном выполнении следующих условий:

- Отсутствие гонок потоков.
- Отсутствие dead lock.
- Отсутствие priority failures.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007090
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Является 100%

Я передумал. Не 100%.

join() - это явная синхронизация, так что на выходе из потока все ок.

А вот тут место вызывающее вопросы.
Код: plaintext
1.
2.
    ++aaa;
    std::thread(doWork).join();



aaa не volatile так что технически компилятор имеет право хранить результат ++aaa в регистре в момент создания потока. Так что поток может увидеть старое значение.
На практике этого скорее всего не происходит. А может где-то даже в стандарте описано что конкретно должно происходить - лень искать.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007091
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так же компилятору дозволяется менять порядок вычисления всего что до join().
Так что ++ может вообще еще не произойти к моменту создания потока.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007094
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
А так же компилятору дозволяется менять порядок вычисления всего что до join().
Так что ++ может вообще еще не произойти к моменту создания потока.

Моё мнение: в данном случае компилятору предписывается выполнить всё что перед функцией создания потока.
Там у этой функции должен быть атрибут заставляющий компилятор вычислить всё что до функции создания потока.
Конечно, этот атрибут компиляторо-зависимый.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007099
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
void main()
{
    ++aaa;
    // Внутри ОС-зависимый вызов функции создания потока. Этот вызов гарантирует сброс всех регистров в кеш
    // ядра процессора. Потом гарантируется полный барьер памяти.
    std::thread(doWork).join();
    // Завершение потока гарантирует ещё один полный барьер памяти. И да, приложение потокобезопасно.
    std::cout << aaa;
}
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007102
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,
> Сейчас вспомню определение
= смешно. Ты не вспоминай. Ты ссылку дай. Взлослый же наверно.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007107
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav

++aaa;
std::thread(doWork).join();
std::cout << aaa;

Вопрос: является ли приложение потокобезопасным?


Я думаю что да. Хотя у вас два потока, основной останавливается на join подождать окончания второго, не производя никакой работы.
Обращение к переменной происходит в строгой очередности, что должно дать предсказуемый результат "3" при любом раскладе.

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

Многопоточное программирование было бы намного сложнее без таких гарантий.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007108
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Давайте всё же считать что "volatile" вообще не имеет никакого отношения к потокобезопасности.

Имеет. Но начиная с С++11 там все равно UB.

petrav Внутри ОС-зависимый вызов функции создания потока. Этот вызов гарантирует сброс всех регистров в кеш ядра процессора. Потом гарантируется полный барьер памяти.
Ну это вы описываете как должно быть по логике.
Но в стандарте с++ например то что join синхронизирует потоки описано явно, а про создание потока - нет.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007123
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Я прошу прощения, компилировать не буду, могу в синтаксисе ошибиться. Но суть будет понятна.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int aaa = 1;

void doWork()
{
    aaa++;
}

void main()
{
    ++aaa;
    std::thread(doWork).join();
    std::cout << aaa;
}


Вопрос: является ли приложение потокобезопасным?

Если внимательно посмотреть, то данный код аналогичен этому
Код: plaintext
1.
2.
3.
4.
5.
6.
void main()
{
    ++aaa;
    doWork();
    std::cout << aaa;
}


Если все так, то отрвать руки тому кто так написал. Если не так, то приводить надо адекватные примеры, а не задавать провокационные вопросы на примере кривого кода.

PS Конкретно тут сработает правильно, но так писать нельзя.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007128
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T

Если все так, то отрвать руки тому кто так написал. Если не так, то приводить надо адекватные примеры, а не задавать провокационные вопросы на примере кривого кода.

Вопрос совершенно корректный. Код, понятно, упрощённая модель боевого кода. Пример адекватный.

Есть что сказать по теме?
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007129
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int aaa = 1;

void main()
{
    ++aaa;
...
}


это оптимизатор может превратить в это
Код: plaintext
1.
2.
3.
4.
5.
6.
int aaa = 2;

void main()
{
...
}
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007130
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
petrav
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int aaa = 1;

void main()
{
    ++aaa;
...
}


это оптимизатор может превратить в это
Код: plaintext
1.
2.
3.
4.
5.
6.
int aaa = 2;

void main()
{
...
}


Давно прораммируете?
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007132
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Давно прораммируете?

Давно. А ты в асме не умеешь смотреть что на самом деле происходит? Там прекрасно все видно: осталось значение в регистре или обратно в память вернулось.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007133
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
petrav
Давно прораммируете?

Давно. А ты в асме не умеешь смотреть что на самом деле происходит? Там прекрасно все видно: осталось значение в регистре или обратно в память вернулось.

В данном случае это вредное искусство. Код должен быть осмысленным, независимым от компилятора, от процессора, от ОС, логичным. Совершенно не важно что там в асме. В асм нужно смотреть только в кардинальных проблемах, которые подсвечивает профайлер.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007140
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Код должен быть осмысленным, независимым от компилятора, от процессора, от ОС
Во-первых - утопия.
Во-вторых, произвольный код не может удовлетворять всем этим ограничениям - только "специально приготовленный". И вот тут-то может оказать необходимым смотреть машинный код разных компиляторов и, возможно, на разных платформах.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007141
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
petrav
Код должен быть осмысленным, независимым от компилятора, от процессора, от ОС
Во-первых - утопия.
Во-вторых, произвольный код не может удовлетворять всем этим ограничениям - только "специально приготовленный". И вот тут-то может оказать необходимым смотреть машинный код разных компиляторов и, возможно, на разных платформах.

И всё же предлагаю вернуться к теме топика. А то мы тут все пообсуждать мастаки.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007145
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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% ))
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007150
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravпредлагаю вернуться к теме топика.

Не к чему возвращаться. Не существует понятия "потокобезопасное приложение".
Потокобезопасным может быть только функция или метод класса и определение этой
"безопасность" базируется на нежеланных различиях результата работы при последовательных
вызовах из одного потока и параллельных из нескольких.

Функция ГПСЧ, например, может творить любую дичь внутри и всё равно быть потокобезопасной,
поскольку у неё в любом случае непредсказуемый результат.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007162
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav,


авторПоток doWork():

- Увеличил значение "aaa" до двух и сохранил это в своём контексте (регистре).
- И потерял значение.


Вы беспокоитесь что поток завершится слишком быстро, и забудет обновить значение глобальной переменной?

Напрасно. Программная модель C/C++ обеспечивает данный контракт. Вы дали указание программе изменить значение глобальной переменной, эта переменная будет правильно изменена.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007163
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подобный код обычно задают на собесах. И спрашивают что здесь происходит.

Еще хуже если в код превносят гонки за состояниями.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int aaa = 1;

void doWork()
{
    aaa++;
}

void main()
{
    ++aaa;
    std::thread(doWork).join();
    std::cout << aaa;
}



С организационной точки зрения вроде-бы все ОК. Но потоки должны выполнять работу в параллелизме.
И эту опцию надо продемонстрировать. В данном примере двух-поточное приложение имеет место и должно
работать. Но опция - никак себя не проявила. И если следующая эквивалентная трансформация дает тот-же эффект

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int aaa = 1;

void doWork()
{
    aaa++;
}

void main()
{
    ++aaa;
    doWork();
    std::cout << aaa;
}



то собеседующий может спросить к примеру - а зачем? Это - ошибка проектирования? Или троллинг?

Я к чему это все. Когда вы хотите поговорить про кеши или скажем про кванты планировщика (которые будут
иметь место в 1 варианте) то вы должны хотя-бы постараться принести в форум нечто РАСКРЫВАЮЩЕЕ возможности
std::thread. Не ходя далеко - процессинг группы файлов например. Или рендеринг картинки частями.

Это как драйв тест машины. Вы-же хотите "давануть" на газ чтоб послушать как звучит ваш новый ДВС или дизель.

Так будьте-же вы инженером чьорт вас подери. Зачем детские примеры кидать?
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007167
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Basil A. Sidorov
пропущено...
Во-первых - утопия.
Во-вторых, произвольный код не может удовлетворять всем этим ограничениям - только "специально приготовленный". И вот тут-то может оказать необходимым смотреть машинный код разных компиляторов и, возможно, на разных платформах.

И всё же предлагаю вернуться к теме топика. А то мы тут все пообсуждать мастаки.
вопрос странный. Приложений потокобезопасных не существует)). Есть глюкавые.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007171
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
petrav,


авторПоток doWork():

- Увеличил значение "aaa" до двух и сохранил это в своём контексте (регистре).
- И потерял значение.


Вы беспокоитесь что поток завершится слишком быстро, и забудет обновить значение глобальной переменной?

Напрасно. Программная модель C/C++ обеспечивает данный контракт. Вы дали указание программе изменить значение глобальной переменной, эта переменная будет правильно изменена.
Я не мыслю в терминах "слишком быстро завершится потому". Это как доказательство математической теоремы: ситуация такая, потому что, теоремы-аксиомы и ч.т.д.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007172
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

Так будьте-же вы инженером чьорт вас подери. Зачем детские примеры кидать?

Это не детские примеры. Это нетривиальные примеры. Которые, вы, майтун, не можете решить.
У вас на это просто не хватит квалификации.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007173
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
mayton

Так будьте-же вы инженером чьорт вас подери. Зачем детские примеры кидать?

Это не детские примеры. Это нетривиальные примеры. Которые, вы, майтун, не можете решить.
У вас на это просто не хватит квалификации.

Знаешь, есть выражение о том что один чудак может 100 мудрецов ушатать вопросами?

Давай свои вопросы. Про кеши и прочее.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007174
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav,


Резонный подход, неудачный пример.

Вы спрашиваете, а не выпуклая ли в плоскость в евклидовой системе.

Ответ - кривизна плоскости в евклидовой системе равна нулю, по определению выбранной системы.

Так и тут - выбрав язык с++, вы приняли программную модель языка, где изменение значения переменной в вашем примере ее изменит.

С точки зрения программы и программиста. Если нет внешних ссылок, оптимизатор может многое выкинуть и распечатать тройку из константы. Программная модель определяет видимое поведение программы, а не эффект ее на кэш, процессор, память или qbits.

Поэтому ваша программа, которая не нарушает правил языка и не затрагивает области неопределенного поведения, выполнится с одинаковым наблюдаемым результатом на любом компьютере с исправным компилятором.

Я собирался оговорить "где int длиннее двух битов", но это уже и так оговорено в стандарте.


Можно разобрать пример вне С++, вы знаете ассемблер? Там нет вышеупомянутых гарантий.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007177
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
petrav
пропущено...

Это не детские примеры. Это нетривиальные примеры. Которые, вы, майтун, не можете решить.
У вас на это просто не хватит квалификации.

Знаешь, есть выражение о том что один чудак может 100 мудрецов ушатать вопросами?

Давай свои вопросы. Про кеши и прочее.

Мой вопрос задан в первых постах. Просто и ясно.

Точно так же ясный вопрос могут ушатать двадцать *удаков. Знакомо да? Вы же этим занимаетесь.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007179
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По первому вопросу тебе уже ответили. Я не хочу повторять про потоко-безопасность. Вопрос был безсмыслицей.

Но если я тебя лично чем то обидел - извини. Не буду сюда писать.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007180
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
По первому вопросу тебе уже ответили. Я не хочу повторять про потоко-безопасность. Вопрос был безсмыслицей.

Вопрос был спорным. Очень проблемным. И ты существуешь в мире где такие вопросы не существуют. В твоём мире они решены.

mayton
Но если я тебя лично чем то обидел - извини. Не буду сюда писать.

Спасибо, лучше не писать.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007189
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
aaa не volatile так что технически компилятор имеет право хранить результат ++aaa в регистре в момент создания потока. Так что поток может увидеть старое значение.
volatile обеспечивает барьер оптимизаций компилятора (в бинарном исполняемом образе при доступе к данной переменной не будет никаких оптимизаций), но не обеспечивает барьер кэша (когерентность) и/или барьер упорядочения операций на процессоре.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007190
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void main()
{
    ++aaa;
    // Внутри ОС-зависимый вызов функции создания потока. Этот вызов гарантирует сброс всех регистров в кеш
    // ядра процессора. Потом гарантируется полный барьер памяти.
    std::thread(doWork).join();
    // Завершение потока гарантирует ещё один полный барьер памяти. И да, приложение потокобезопасно.
    std::cout << aaa;
}

В стандарте ничего не сказано о барьерах памяти до конструктора std::thread и после join(). Сказано лишь, что join() блокирует вызывающий поток до тех пор, пока вызванный поток, представленный в join() как *this не завершит свою работу. Поэтому не стоит полагаться на то, что mfence будет как внутри вызванного потока перед его завершением, так и после продолжения работы вызывающего потока.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007191
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У ТС несомненно занимательная история с этим вопросом.

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

Человек пришел похвастаться новыми знаниями и подловить бывалых, но тут он себя почувствовал в дураках повторно.

Я могу посочувствовать; когда мне было 12 лет меня поймали вопросом "что тяжелее, тонна железа или тонна дерева". На следующий день "словил" крутой загадкой учителя физики.

Мое ликование было кратковременным, когда он объяснил что у них разный вес. Хороший был урок, не повторять (тем более защищать) чужие глупости. Своих всегда хватает.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007192
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Я могу посочувствовать; когда мне было 12 лет меня поймали вопросом "что тяжелее, тонна железа или тонна дерева". На следующий день "словил" крутой загадкой учителя физики.

Мое ликование было кратковременным, когда он объяснил что у них разный вес. Хороший был урок, не повторять (тем более защищать) чужие глупости. Своих всегда хватает.

И что у тонны железа и у тонны дерева действительно разный вес?
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007193
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav,


Несомненно.

Тонна + это единица массы, вес - единица силы.

Дерево легче на произведение положительной разницы объемов на плотность атмосферы.

В вакууме легче, тк влага начнет испаряться

Вам нравятся такие задачки? У вас впереди много удовольствия.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007194
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
petrav
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void main()
{
    ++aaa;
    // Внутри ОС-зависимый вызов функции создания потока. Этот вызов гарантирует сброс всех регистров в кеш
    // ядра процессора. Потом гарантируется полный барьер памяти.
    std::thread(doWork).join();
    // Завершение потока гарантирует ещё один полный барьер памяти. И да, приложение потокобезопасно.
    std::cout << aaa;
}

В стандарте ничего не сказано о барьерах памяти до конструктора std::thread и после join(). Сказано лишь, что join() блокирует вызывающий поток до тех пор, пока вызванный поток, представленный в join() как *this не завершит свою работу. Поэтому не стоит полагаться на то, что mfence будет как внутри вызванного потока перед его завершением, так и после продолжения работы вызывающего потока.

В этом и был начальный вопрос. Осталось переписать исходный код так что бы он был потокобезопасным.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007195
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
petrav,


Несомненно.

Тонна + это единица массы, вес - единица силы.

Дерево легче на произведение положительной разницы объемов на плотность атмосферы.

В вакууме легче, тк влага начнет испаряться

Вам нравятся такие задачки? У вас впереди много удовольствия.

Ну, да, я ошибся. Но таких задачек я нарешался в школе. Что там было Перельман. Я может ошибся.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007196
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
В этом и был начальный вопрос. Осталось переписать исходный код так что бы он был потокобезопасным.
С какой целью?
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007197
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
rdb_dev
пропущено...
В стандарте ничего не сказано о барьерах памяти до конструктора std::thread и после join(). Сказано лишь, что join() блокирует вызывающий поток до тех пор, пока вызванный поток, представленный в join() как *this не завершит свою работу. Поэтому не стоит полагаться на то, что mfence будет как внутри вызванного потока перед его завершением, так и после продолжения работы вызывающего потока.

В этом и был начальный вопрос. Осталось переписать исходный код так что бы он был потокобезопасным.
Хотя тут я могу ошибаться и тогда Anatoly Moskovsky 22211754 прав.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007199
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуть усложним алгоритм...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
volatile int aaa;

void doWork()
{
  aaa++;
  std::this_thread::sleep_for(std::chrono::duration<size_t, std::milli>(1));
  aaa++;
}

int main (int argc, char** argv)
{
  for (size_t i = 0; i < 10; i++)
  {
    aaa = 1;
    std::thread th(doWork);
    ++aaa;
    std::this_thread::sleep_for(std::chrono::duration<size_t, std::milli>(10));
    printf("\r\n%i", aaa);
    th.join();
    printf("; %i", aaa);
  }
  return 0;
}

Результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
4; 4
3; 4
4; 4
3; 4
3; 4
3; 4
4; 4
3; 4
3; 4
4; 4
Казалось бы, изменение значения "++aaa" после "std::thread th(doWork)" должно теряться, но этого не происходит. Возможно, реализация sleep_for() имеет недокументированный побочный эффект в виде барьера памяти.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007200
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стабильная утрата одного из двух изменений значения
Код: 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.
static volatile int aaa;

void doWork()
{
  aaa += 100;
  std::this_thread::sleep_for(std::chrono::duration<size_t, std::milli>(14));
  aaa += 10;
}


int main (int argc, char** argv)
{
  volatile int tmp;
  for (size_t i = 0; i < 1000; i++)
  {
    aaa = 1;
    std::thread th(doWork);
    std::this_thread::sleep_for(std::chrono::duration<size_t, std::milli>(14));
    tmp = aaa;
    ++aaa;
    th.join();
    if (112 != aaa)
      printf("\r\niteration %zu: %i; %i", i, tmp, aaa);
  }
  return 0;
}


Результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
iteration 26: 101; 102
iteration 98: 101; 102
iteration 262: 101; 102
iteration 308: 101; 102
iteration 347: 101; 102
iteration 435: 101; 102
iteration 462: 101; 111
iteration 570: 101; 111
iteration 760: 101; 102
iteration 782: 101; 102
iteration 821: 101; 102
iteration 856: 101; 111
iteration 875: 101; 111
iteration 885: 101; 102
iteration 940: 101; 111
iteration 967: 101; 111
iteration 989: 101; 102
Но результат НЕ означает, что в join() отсутствует синхронизация памяти потоков, а означает лишь то, что в кэше теряется одно из двух изменений - либо "++aaa", либо "aaa += 10".
Data race...
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007203
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
Чуть усложним алгоритм...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
volatile int aaa;

void doWork()
{
  aaa++;
  std::this_thread::sleep_for(std::chrono::duration<size_t, std::milli>(1));
  aaa++;
}

int main (int argc, char** argv)
{
  for (size_t i = 0; i < 10; i++)
  {
    aaa = 1;
    std::thread th(doWork);
    ++aaa;
    std::this_thread::sleep_for(std::chrono::duration<size_t, std::milli>(10));

...

Казалось бы, изменение значения "++aaa" после "std::thread th(doWork)" должно теряться, но этого не происходит. Возможно, реализация sleep_for() имеет недокументированный побочный эффект в виде барьера памяти.

Создание потока далеко не бесплатная операция, если не путаю там порядка 1000-2000 тактов процессорных тратится, потому если хочешь чтобы синхронно заработал код в новом потоке - надо их синхронизировать, т.е. дождаться инициализации потока. Хотя и это не поможет, т.к. "++aaa" легкая операция, пара тактов.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007205
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T

Создание потока далеко не бесплатная операция, если не путаю там порядка 1000-2000 тактов процессорных тратится, потому если хочешь чтобы синхронно заработал код в новом потоке - надо их синхронизировать, т.е. дождаться инициализации потока. Хотя и это не поможет, т.к. "++aaa" легкая операция, пара тактов.

Не очень понятно почему вы рассуждаете в терминах каких-то задержек, тактов процессора и т.д.

Я предлагаю рассуждать в терминах математической корректности, в терминах денег, жизней людей и личной подсудности.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007209
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
Чуть усложним алгоритм...
volatile int aaa;

Поясните плиз: зачем вы использовали volatile? Запрет на кеширование значения переменной
не имеет ничего общего с потокобезопасностью. Ваш код откровенно некорректный и вы делаете
из него какие-то выводы.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007214
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
petrav
В этом и был начальный вопрос. Осталось переписать исходный код так что бы он был потокобезопасным.
С какой целью?
у него не бывает вопросов с практическими целями.
Так, что в голову взбредет.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007215
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
mayton
По первому вопросу тебе уже ответили. Я не хочу повторять про потоко-безопасность. Вопрос был безсмыслицей.

Вопрос был спорным. Очень проблемным. И ты существуешь в мире где такие вопросы не существуют. В твоём мире они решены.

mayton
Но если я тебя лично чем то обидел - извини. Не буду сюда писать.

Спасибо, лучше не писать.

ТС
Вопросы в топике без отсылки к документации о том что является Thread-safe являются флудом
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007224
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
rdb_dev
Чуть усложним алгоритм...
volatile int aaa;

Поясните плиз: зачем вы использовали volatile? Запрет на кеширование значения переменной
не имеет ничего общего с потокобезопасностью. Ваш код откровенно некорректный и вы делаете
из него какие-то выводы.
Внимательней надо быть. 22211815
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007226
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
ТС
Вопросы в топике без отсылки к документации о том что является Thread-safe являются флудом
Это , конечно, не документация, но меня устраивает.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007230
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
PetroNotC Sharp
ТС
Вопросы в топике без отсылки к документации о том что является Thread-safe являются флудом
Это , конечно, не документация, но меня устраивает.

замечательно.
Теперь осмысливаем фразу
авторКод потокобезопасен, если он функционирует исправно при использовании его из нескольких потоков одновременно.
и сравниваем с тем что автор ТС спрашивает?
))))
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007231
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
он не понимает разницы между "обособленном коде" и словом "Программа"
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007232
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тьфу, ещё хуже - "Приложение"
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007233
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
То есть если на пальцах.
Гипсокартон влагоустойчив только при проверке его методом погружения во влажную среду.
Куда мы погружаем "Приложение" непонятно)
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007234
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
petrav
пропущено...

Поясните плиз: зачем вы использовали volatile? Запрет на кеширование значения переменной
не имеет ничего общего с потокобезопасностью. Ваш код откровенно некорректный и вы делаете
из него какие-то выводы.
Внимательней надо быть. 22211815

Я, конечно, прочитал это ваше сообщение. Там как раз вы и поясняете почему волотайл не
имеет ничего общего с многопоточностью.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007236
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav, почему же не имеет? Как раз имеет!
В программе, где все значения переменных зависят только от действий логики программы в одном - основном потоке, в volatile попросту нет смысла. Зачем в однопоточной программе ставить барьер для оптимизации компилятора в отношении какой-то переменной? Бессмыслица какая-то...
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007237
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLДерево легче на произведение положительной разницы объемов на плотность атмосферы.

Но при этом школьная формула веса это P = mg. Буква V в ней отсутствует.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007239
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
petrav, почему же не имеет? Как раз имеет!
В программе, где все значения переменных зависят только от действий логики программы в одном - основном потоке, в volatile попросту нет смысла. Зачем в однопоточной программе ставить барьер для оптимизации компилятора в отношении какой-то переменной? Бессмыслица какая-то...
+1)
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007259
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

НеофитSQLДерево легче на произведение положительной разницы объемов на плотность атмосферы.
Но при этом школьная формула веса это P = mg. Буква V в ней отсутствует.По всей видимости, подразумевалась формула: p = m/V <=> m = p*V
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007262
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Определение "веса" однозначно: это сила, равная реакции опоры, но противоположная ей по
направлению. В школьную формулу этой силы объём не входит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007272
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мои 5 коп. в тему)) речь об Архимедовой силе, в деревяшке объём больше (не знаю как в железном дереве).
- А вы знаете, - сказал Остап Бендер, - на каждого из нас давит столб воздуха весом в 2 с половиной кило.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007315
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Определение "веса" однозначно: это сила, равная реакции опоры, но противоположная ей по
направлению. В школьную формулу этой силы объём не входит.

Воздух с одной силой выталкивает, вода с другой, можно еще в ртути попробовать утопить. Если те же вещи в вакууме проверить, то сила поменяется.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007326
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Dima T

Создание потока далеко не бесплатная операция, если не путаю там порядка 1000-2000 тактов процессорных тратится, потому если хочешь чтобы синхронно заработал код в новом потоке - надо их синхронизировать, т.е. дождаться инициализации потока. Хотя и это не поможет, т.к. "++aaa" легкая операция, пара тактов.

Не очень понятно почему вы рассуждаете в терминах каких-то задержек, тактов процессора и т.д.

Это был маленький оффтоп для rdb_dev
petrav
Я предлагаю рассуждать в терминах математической корректности, в терминах денег, жизней людей и личной подсудности.

Хрень какая. У каждой проги в лицензии написано "as is", в перевода на русский "кому должен всем прощаю"

Стандарт С/С++ пишется с оглядкой на возможности железа, он не для сферического вакуума, поэтому в основе лежат такты и задержки, с учетом их рождаются общие правила для разных типов процессоров.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007335
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВоздух с одной силой выталкивает, вода с другой

А ещё различия в центробежной силе из-за разного положения точек тяжести. Но в пределах
школьной программы это всё под плинтусом достаточной точности. Точно так же все программы
в которых ничего нет между созданием потока и его завершением - однопоточны вне
зависимости от того в скольких линиях кэша и ядрах процессора они обрабатываются.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007344
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Dima TВоздух с одной силой выталкивает, вода с другой

А ещё различия в центробежной силе из-за разного положения точек тяжести. Но в пределах
школьной программы это всё под плинтусом достаточной точности. Точно так же все программы
в которых ничего нет между созданием потока и его завершением - однопоточны вне
зависимости от того в скольких линиях кэша и ядрах процессора они обрабатываются.

Эх ... . Я ребенку в 8 классе репититора нанял по алгебре/геометрии, т.к. сам затрахался узнавать их домашнее задание, а нет задания - делать нечего. Репетитор(ша) до кучи оказалась со знанием физики и физику порешали параллельно. В итоге физик сказал ребенку: "Можешь ведь", ребенок ответил "Репетитор объяснил". Вот такое нынче образование (((
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007371
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
petrav
Не очень понятно почему вы рассуждаете в терминах каких-то задержек, тактов процессора и т.д.
Это был маленький оффтоп для rdb_dev
Я знаком с системами команд некоторых процессоров, с тех пор когда был популярен ZX Spectrum, а с системой команд процессоров Intel знаком начиная с i8086, если ты знаешь, что это такое. Так что ты меня изрядно повеселил заявив, что этот оффтоп был специально для меня.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007402
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
Dima T
пропущено...
Это был маленький оффтоп для rdb_dev
Я знаком с системами команд некоторых процессоров, с тех пор когда был популярен ZX Spectrum, а с системой команд процессоров Intel знаком начиная с i8086, если ты знаешь, что это такое. Так что ты меня изрядно повеселил заявив, что этот оффтоп был специально для меня.

Я писал 22211830 почему твой эмулятор data race не заработал.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007439
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, какой data race можно эмулировать в цикле на 10-ти итерациях без синхронизации по spin-lock, да ещё и при ожидании после всех изменений? Это была демонстрация побочного эффекта sleep_for и синхронизации в join().

Демонстрация data race здесь 22211827
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40007458
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Dima T,

Бессмысленно обсуждать какой должен быть результат когда есть race.
Data race -это UB. Поэтому результат любой.
Если как в вашем примере в двух потоках происходит модификация переменной, то это race. Что либо ожидать от такого кода нет смысла.

ЗЫ. В исходном примере нет race поэтому результат там детерминированный.
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40008309
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky
"synchronizes with" это release+acquire barrier.
release+acquare запись/чтение это частный случай "synchronizes with".
...
Рейтинг: 0 / 0
Небольшой вопрос про std::thread
    #40008461
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest
Anatoly Moskovsky
"synchronizes with" это release+acquire barrier.
release+acquare запись/чтение это частный случай "synchronizes with".

release+acquire barrier это низкоуровневый механизм реализации высокоуровневой концепции "synchronizes with".
Другие механизмы существуют (напр. mutex), но они все равно сводятся к release+acquire
...
Рейтинг: 0 / 0
82 сообщений из 82, показаны все 4 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Небольшой вопрос про std::thread
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]