Пишу приложение, использующее потоки, количество потоков колеблется от 10 до 100.
Все эти потоки обращаются в интернет, что для меня ставит большую проблему в их синхронизации.
Проблема в следующем, если один поток находит определенную комбинацию символов в ответе сервера, то все остальные потоки нужно поставить на паузу, соответственно возникает вопрос, как получить список всех потоков, кроме основного и максимально быстро поставить их на паузу.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
10-10-2009 19:26
Зря Вы так.Насчёт "количество потоков колеблется от 10 до 100.",это просто чудовищно.Для системы.Не верьте в безграничные возможности изобретателей и техники.Это реклама.Система ОЧЕНЬ критична по ресурсам.
Поэтому пересмотрите свой подход - идея нагрузить сотней программ не есть удачная.Что-то в алгоритме не то.
Все эти потоки обращаются в интернет
Вообще для этого совершенно не нужно создавать кучу потоков: Windows предлагает множество других вариантов работы с сокетами, это и сообщения и события и Overlaped и APC и даже IO Completion Ports.
Ставить на паузу все равно лучше "изнутри" (Suspend и Resume лучше не использовать).
Если потоков много, то логично сделать общий булевый триггер паузы с эксклюзивной записью и свободным чтением (где сделать - вам виднее, свойством глобального объекта или еще как). Периодически проверяя этот триггер, потоки будут ставить себя на паузу (входя в ожидание общего для всех потоков события пробуждения).
Где проверять паузу? Если ваши потоки выполняют блокирующие операции, то логично проверять паузу до и после блокирования, периодически в ходе длительных расчетов (если есть), а также перед операциями взаимодействия с внешним миром - другими потоками и i/o. Если операции неблокирующие, то вы скорее всего используете WaitForMultipleObjects или т.п., тогда вам также нужен общее для всех потоков событие паузы, чтобы добавить его в массив ожидаемых событий, чтобы после этого при необходимости отменить асинхронные вызовы и далее ожидать события пробуждения.
Вообще, чтобы минимизировать ошибки при написании многопоточных приложений, лучше относиться к потоку как к активному (самоуправляемому) объекту, черному ящику, с которым мы общаемся посредством событий, сообщений и, с огромной осторожностью, разделяемых данных, и отказаться от любых попыток управлять им непосредственно.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.