LINUX.ORG.RU

Простой вопрос по C++ multithreading

 ,


0

1

Доброго времени суток, форумчане. Всем добра.

Набросал простой многопоточный код http://cpp.sh/8jtuk
Но не ожидал увидеть вот такое:

thread: 2 start
thread: 2 end
thread: 1 join
thread: 3 start
thread: 3 end
thread: 1 start
thread: 1 end
thread: 2 join
thread: 3 join

Скорее всего проблема в буферизации вывода. Но я вроде и мютексом обернул и flush дернул.

Спасибо всем кто объяснит, что я делаю не так с выводом на экран.

потому что использовал join вместо deatach - join надо было ставить на последний и заведомо самый долгий поток

Silerus ★★★ ()
Ответ на: комментарий от aiqu6Ait

в [сообщение] может быть, а может и не быть

thread: 1 join
thread: 1 start 
[thread: 1 end]
thread: 2 join
[thread: 1 end]
thread: 2 start
[thread: 2 end]
thread: 3 join
[thread: 1 end]
thread: 3 start
thread: 3 end

unittests ()

Разве std::endl не вызывает внутри себя std::flush ?

rumgot ★★★★★ ()

Замени cout на cerr.

Deleted ()

Резюмирую:
С проблемой разобрался, проблема была в не правильном моем
понимании создания нитей и их привязке к «родительской» нити.
Если мы хотим чтобы код нитей выполнялся последовательно, нужно:

* создали нить.
* ожидаем завершения ее выполнения.
* создаем новую нить.
* ждем завершения ее выполнения.

код: cpp.sh/4xzzg.
Т.е. я думал что нить запускается в момент вызова join, что конечно же не так.
Вывод объясняется тем, что планировщик, как его и просят, создает три нити и **запускает** их.
операции join выполнятся, как и следовало последовательно, это видно из вывода в заголовке темы.

Всем спасибо!

unittests ()
Ответ на: комментарий от unittests

Вывод твоего изначального кода с cerr

thread: 1 start
thread: 1 end
thread: 3 start
thread: 3 end
thread: 2 start
thread: 2 end
thread: 1 join
thread: 2 join
thread: 3 join

Deleted ()
Ответ на: комментарий от Silerus

Чушь какая. detach вообще не нужно никогда использовать, это грязный хак. В адекватном коде потоки должны явно джойниться. И поставлены они правильно - все потоки породили, все сджойнили, какой сколько выполняется нам не важно, мы всё равно дождёмся самого долгого.

slovazap ★★★★★ ()

Всё правильно ты делаешь с выводом на экран за исключением испольования cout вместо cerr и вызовом flush после endl, который сам зовёт flush, но это только косметические проблемы.

А вывод такой потому что созданный thread совершенно не обязан сразу запланироваться, соответственно некоторые потоки начинают выполняться только когда основной поток входит в join.

slovazap ★★★★★ ()
Последнее исправление: slovazap (всего исправлений: 2)
Ответ на: комментарий от slovazap

detach вообще не нужно никогда использовать

Именно поэтому std::thread его наружу выставляет

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.