Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > рассуждения о Join()


Автор: Hohhi 26.9.2010, 18:27
Добрый день! Не могу разобраться в особенностях программирования потоков. К примеру, из main я запустил 3 потока, затем для запуска 4ого мне нужно подождать завершения всех трех. Я пишу что-то типа:
Код

thread1.Join():
thread2.Join();
thread3.Join();


На самом деле получилось я заменил объединение трех потоков, последовательным объединением их с main. При этом равномерности в работе 3ех потоков ждать не стоит. То есть по теор веру большое время работы с процессором сначала получать первый поток(в зависимости от сложности кода в main между созданием и слиянием потока). Это как то неверно. Гораздо удобнее и семантичнее было бы нечто подобное:
Код

ActiveThread.Wait(thread1,thread2,thread3)


Поправьте, пожалуйста, в рассуждениях

Автор: iBass 26.9.2010, 19:31
Hohhi, самой собой, так как Join непосредственно не дает выполнения следующих за ним операций, пока поток не завершит исполнение. Я вам советую поместить вашу многопоточность вместе с join в метод, а затем запустить это метод как поток в main, но уже без Join-а  

Автор: mihryak 27.9.2010, 03:32
Твой семантичный и, действительно, удачный вариант во фреймворке есть. Используй в каждом потоке AutoResetEvent или ManualResetEvent + WaitHandle.WaitAll(events) снаружи потоков.
Только стоит учесть, что этот метод принимает до 64 (зависит от фреймворка, но  не меньше, насколько я знаю) waitHandle'ов. Чтобы обойти это ограничение, или же просто в качестве альтернативы можно использовать счётчик выполненных потоков, не забывая позаботиться о его синхронизации с помощью методов класса Interlocked

Автор: Hohhi 27.9.2010, 18:07
mihryak, попробывал, спасибо

Автор: userdab 27.9.2010, 19:10
Может еще смоит посмотреть http://social.msdn.microsoft.com/Forums/ru-RU/csharpru/thread/ebc12187-ae4d-41ca-892f-4a24ff09db79

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)