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


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