| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > рассуждения о Join() |
| Автор: Hohhi 26.9.2010, 18:27 | ||||
Добрый день! Не могу разобраться в особенностях программирования потоков. К примеру, из main я запустил 3 потока, затем для запуска 4ого мне нужно подождать завершения всех трех. Я пишу что-то типа:
На самом деле получилось я заменил объединение трех потоков, последовательным объединением их с main. При этом равномерности в работе 3ех потоков ждать не стоит. То есть по теор веру большое время работы с процессором сначала получать первый поток(в зависимости от сложности кода в main между созданием и слиянием потока). Это как то неверно. Гораздо удобнее и семантичнее было бы нечто подобное:
Поправьте, пожалуйста, в рассуждениях |
| Автор: 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 |