218 / 212 / 63
Регистрация: 17.04.2012
Сообщений: 382
|
||||||
1 | ||||||
Корректировка работы нескольких потоков с одним циклом17.04.2012, 11:48. Показов 1960. Ответов 10
Метки нет (Все метки)
Привет. Ребята, нужна ваша помощь. Не могу распаралелить поток.
В чем собственно состоит проблема. Сейчас каждый поток выводит числа от 0 до 9, а мне нужно чтоб выводило следующие записи th0 = 0; th1 = 1; th3 = 2; th0 = 4; th2 = 3; th0 = 6; th2 = 5; ...... то есть заданное количество потоков вместе работали с одним цыклом. Один поток выводит одно число, второй второе, третий четвертее, четвертый третее и т.д. Скажу наперед, что явно распределить на сигменты не получить потому, что количестве запичей в цыкле будет менятся от 1 до 5000. Если кому то интересно - то это программа обзвона обенентов под 5 модемов. Каждый модем - отдельныя ветка. То есть каждый модем берет телефон с массива и звонит на него. Такая операция должна паралельно выполнятся под 5 модемов. если я буду явно задавать для каждого модема массив телефнов, то может оказатся, что один можем получит 500 телефнов, второй 30, а все остальные вообще ничего. Поэтому мне и нужно чтоб 5 потоков работали с одной процедурой и работать под 5 потоков с одной процедурой
0
|
17.04.2012, 11:48 | |
Ответы с готовыми решениями:
10
Создание нескольких элементов одним циклом Отображение общего прогресса работы нескольких потоков на одном progressbar Вывод результата работы нескольких потоков в Memo - выводится данные только последнего Сделать с одним циклом |
17689 / 12874 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
||||||
17.04.2012, 14:25 | 2 | |||||
Сделайте одну общую коллекцию с телефонами и сколько-то там потоков.
Пусть эти потоки, синхронизируясь, достают по одному элементу из коллекции и звонят на него, пока все элементы не закончатся.
1
|
218 / 212 / 63
Регистрация: 17.04.2012
Сообщений: 382
|
||||||
17.04.2012, 21:48 [ТС] | 3 | |||||
все бы ничего но в строке
0
|
17689 / 12874 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
17.04.2012, 22:02 | 4 |
А в первой строке у вас, получается, есть ConcurrentQueue?
0
|
218 / 212 / 63
Регистрация: 17.04.2012
Сообщений: 382
|
|
18.04.2012, 09:16 [ТС] | 5 |
да, этой тоже нету. Все написано под Framework 3.5
твой код под 4-ый. Пасиб, в режиме теста все работает, попробую отточить код под 4-й фрейм.
0
|
17689 / 12874 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
||||||
18.04.2012, 12:03 | 6 | |||||
Под 3.5 тоже можно написать, но придется синхронизировать очередь вручную:
1
|
218 / 212 / 63
Регистрация: 17.04.2012
Сообщений: 382
|
||||||
18.04.2012, 13:08 [ТС] | 7 | |||||
kolorotur, пасиб виручил.
ща разберусь с кодом. потому что с очередями еще не работал. Может кому-то пригодится, код работы 5-и потоков с одним масивом.
0
|
17689 / 12874 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
18.04.2012, 13:16 | 8 |
У вас не синхронизирован доступ к PtrToArray во время проверки.
Может возникнуть ситуация с выходом за пределы массива.
0
|
218 / 212 / 63
Регистрация: 17.04.2012
Сообщений: 382
|
||||||
19.04.2012, 14:44 [ТС] | 9 | |||||
так он же лочится при при каждом новом переходе:
не могу смоделировать такую ситуацию, когда он может это сделать.
0
|
17689 / 12874 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|||||||||||
19.04.2012, 15:24 | 10 | ||||||||||
Он лочится, но только при инкременте, а при проверке - нет.
Ситуацию смоделировать очень легко: Итак, у нас есть следующий цикл:
Предположим, что происходит обход массива из десяти элементов и на данный момент значение PtrToArray = 9, N = 10. Начинаем отслеживание: 1. Первый поток делает проверку. Проверка проходит. 2. Второй поток делает проверку. Проверка проходит. 3. Первый поток создает переменную curVal. 4. Второй поток создает переменную curVal. 5. Первый поток заходит в критическую зону. 6. Второй поток пытается зайти в критическую зону и замораживается, т.к. в ней уже первый поток. 7. Первый поток достает элемент под индексом 9, присваивает его переменной curVal и увеличивает значение PtrToArray до 10-и. 8. Первый поток выходит из критической зоны и выводит сообщение. 9. Второй поток заходит в критическую зону. 10. Второй поток пытается достать элемент под индексом 10 (он ведь уже раньше прошел проверку и "предполагает", что PtrToArray все еще < N) и чпок - вылетает IndexOutOfRangeException. Исправить можно, делая проверку и присваивание значения элементу в критической зоне:
1
|
218 / 212 / 63
Регистрация: 17.04.2012
Сообщений: 382
|
|
19.04.2012, 23:17 [ТС] | 11 |
Добавлено через 2 минуты
все, въехал.! спасибо, вам, за розъяснения.
0
|
19.04.2012, 23:17 | |
19.04.2012, 23:17 | |
Помогаю со студенческими работами здесь
11
Программа с одним циклом Замедление работы потоков если запущено несколько потоков Создание потоков циклом Заполнить матрицу одним циклом Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |