powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Небольшой вопрос про std::thread
25 сообщений из 82, страница 2 из 4
Небольшой вопрос про 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
25 сообщений из 82, страница 2 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / Небольшой вопрос про std::thread
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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