Member 14742111 Ответов: 3

Отличается ли выполнение потоков при каждом выполнении?


Дает ли одновременное выполнение потоков (в коде C в Linux) в двух разных терминалах разные результаты?

Что я уже пробовал:

Hello, I wrote a code which creates 4 threads. The working of the 4  threads are similar, but the number of iterations for each of them and the time of trigger is different. I executed the codes simultaneously on 2 terminals and both yield results. I have an additional function to find out the task with the maximum execution time. For every execution, this function's result is also different. Is this they way it is supposed to be? 

3 Ответов

Рейтинг:
1

CPallini

Цитата:
Неужели так и должно быть?
Да.


Рейтинг:
0

OriginalGriff

Ах, нитки ... неужели они всегда одни и те же?

В идеальной ситуации каждое приложение всегда будет детерминированным: каждый раз, когда вы запускаете его, оно дает одни и те же результаты. Но мы живем в реальном мире, и наша ОС не делает то же самое каждый раз, когда ваше приложение запускается. Поэтому, когда вы начинаете многопоточность, вы должны понимать, что каждый поток независим, если вы специально не кодируете их для синхронизации (и это становится чрезвычайно сложным, если вы не очень, очень осторожны). Эта независимость означает, что ОС вольна запускать их так, как она считает нужным, и по мере того, как ядра в вашем процессоре становятся свободными или упреждающе освобождаются, чтобы позволить другим потокам работать.

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

Это не очень хорошая область для начинающих: вам нужно очень, очень тщательно подумать и спланировать потоковую обработку, прежде чем вы начнете кодировать, или вы можете попасть в ситуацию, когда один поток влияет на другой, и они оба не могут работать, пока другой не будет работать.


Рейтинг:
0

Patrice T

Цитата:
Отличается ли выполнение потоков при каждом выполнении?

Да, это всегда отличается, потому что ОС уже имеет сотни потоков, работающих непрерывно, и невозможно повторить точно такие же условия на 2 прогонах.
Цитата:
результат этой функции также отличается. Неужели так и должно быть?

Если результат отражает планирование потоков, то это нормально.
Если результатом является вычисление, то это ненормально. Вы должны разработать свой код, чтобы учесть это поведение потоков.