2 / 2 / 0
Регистрация: 28.08.2011
Сообщений: 29
1

Как правильно синхронизировать потоки?

07.09.2011, 19:04. Показов 2070. Ответов 14
Метки нет (Все метки)

По нажатию кнопки создается N потоков (в данном случае 5):

C#
1
2
3
4
5
6
7
Thread[] threads = new Thread[5];
 
            for (int i = 0; i < threads.Length; i++)
            {
                threads[i] = new Thread(GetResponse);
                threads[i].Start();
            }
GetResponse - метод. После нажатия кнопки программа работает в 5 потоков, но каждый поток полностью выполняет метод (например, цикл повторяется 100 раз и все 5 потоков проходят цикл 100 раз). Как правильно синхронизировать потоки, чтобы каждый из них проходил цикл примерно по 20 раз (то есть, 100повторов/5потоков)?
Заранее спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.09.2011, 19:04
Ответы с готовыми решениями:

Синхронизировать потоки
Имеется форма и консольное приложение.Имеется 3 потока, нужно синхронизировать их работу между...

Замедлится ли работа приведенного кода, если синхронизировать потоки
Допустим , мы написали программу, который многопоточно брутит пароли (подбирает). Пример...

Как правильно использовать потоки?
Доброго времени суток столкнулся со следующей проблемой не могу выполнить функцию в потоке ...

как правильно делаются потоки
Доброго времени суток форумчане !!!! Пишу программку , вот стал вопрос о том , что мне нужно...

14
Vault dweller
88 / 88 / 5
Регистрация: 05.03.2011
Сообщений: 327
07.09.2011, 19:49 2
Смотри Parallel.For
1
2 / 2 / 0
Регистрация: 28.08.2011
Сообщений: 29
07.09.2011, 20:03  [ТС] 3
Еще есть какие-нибудь варианты?
0
48 / 48 / 8
Регистрация: 26.08.2011
Сообщений: 84
07.09.2011, 20:13 4
Если всё правильно понял то можно реализовать вот так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using System.Threading;
 
class SomeClass
{
    void GetResponse() { }
 
    void SomeMethod()
    {
        // Количество повторов цикла.
        int iterationCount = 20;
 
        for (int i = 0; i < iterationCount; i++)
        {
            // Инициализировать массив потоков.
            Thread[] threads = new Thread[5];
 
            // Инициализировать потоки и сразу запустить.
            for (int j = 0; j < threads.Length; j++)
            {
                threads[j] = new Thread(new ThreadStart(GetResponse));
                threads[j].Start();
            }
 
            // Синхронизировать потоки.
            foreach (Thread thread in threads)
                thread.Join();
        }
    }
}
0
2 / 2 / 0
Регистрация: 28.08.2011
Сообщений: 29
07.09.2011, 20:19  [ТС] 5
lambda, не помогает, все равно каждый поток работает отдельно.
А вот по поводу Parallel.For я так и не додумался, как реализовать. Непонятно, как запускать потоки и как вообще работать с Parallel.For... В таком виде никак не прокатит - Parallel.For (0, 100, i => Foo (i));
0
Заблокирован
07.09.2011, 20:26 6
а что нужно сто действий на N потоков или чтоб каждый поток делал 100/N повторов?

немного по-конкретней сформулируйте вопрос.
добавлено
или чтоб по-очереди 100/N повторов?
0
2 / 2 / 0
Регистрация: 28.08.2011
Сообщений: 29
07.09.2011, 20:32  [ТС] 7
сто действий на N потоков
То есть если есть 1000 повторов в цикле, то они должны быть разбросаны на N потоков, а не так чтобы эти N потоков каждый по 1000 повторов делал.
0
Заблокирован
07.09.2011, 20:34 8
Цитата Сообщение от smartweb Посмотреть сообщение
То есть если есть 1000 повторов в цикле, то они должны быть разбросаны на N потоков, а не так чтобы эти N потоков каждый по 1000 повторов делал.
да, так и есть, если не нужно именно 1000, например, на 7 потоков.
0
Vault dweller
88 / 88 / 5
Регистрация: 05.03.2011
Сообщений: 327
07.09.2011, 20:35 9
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int numberOfThread = 5;
int numberOfIteration = 1000;
             
Thread[] threads = new Thread[numberOfThread];
 
for (int i = 0; i < numberOfThread; i++)
{
     threads[i] = new Thread(() => 
     {
          for (int j = 0; j < int numberOfIteration/numberOfThread; j++)
          {
                Console.WriteLine("Iteration {0} from thread {1}",j ,i);
          }
     });
     threads[i].Start();
}
0
2 / 2 / 0
Регистрация: 28.08.2011
Сообщений: 29
07.09.2011, 20:49  [ТС] 10
G.E.C.K, а где нужно вызывать GetResponse?

да, так и есть, если не нужно именно 1000, например, на 7 потоков.
Это был ответ на ваш вопрос выше - нужно "сто действий на N потоков".
0
Заблокирован
07.09.2011, 21:34 11
либо к семафору привяжитесь(не знаю, можно ли из потока изменять максимум)
либо создать переменную, инкрементировать ее, и блокировать(ее изменения) через lock(0 - все завершаются).
0
2 / 2 / 0
Регистрация: 28.08.2011
Сообщений: 29
08.09.2011, 22:23  [ТС] 12
Все-таки хотелось бы получить ответ, где вызывать метод?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int numberOfThread = 5;
int numberOfIteration = 1000;
             
Thread[] threads = new Thread[numberOfThread];
 
for (int i = 0; i < numberOfThread; i++)
{
     threads[i] = new Thread(() => 
     {
          for (int j = 0; j < int numberOfIteration/numberOfThread; j++)
          {
                Console.WriteLine("Iteration {0} from thread {1}",j ,i);
          }
     });
     threads[i].Start();
}
0
Vault dweller
88 / 88 / 5
Регистрация: 05.03.2011
Сообщений: 327
09.09.2011, 00:15 13
Метод уже в коде встроен же ж:
C#
1
2
3
4
5
6
() => 
     {
          for (int j = 0; j < int numberOfIteration/numberOfThread; j++)
          {
                Console.WriteLine("Iteration {0} from thread {1}",j ,i);
          }
0
2 / 2 / 0
Регистрация: 28.08.2011
Сообщений: 29
09.09.2011, 16:28  [ТС] 14
А, тогда это не то получается... Делают же программы, которые работают многопоточно и в строке состояния отображается весь процесс, а не каждого потока...
0
Заблокирован
09.09.2011, 20:35 15
Цитата Сообщение от smartweb Посмотреть сообщение
А, тогда это не то получается... Делают же программы, которые работают многопоточно и в строке состояния отображается весь процесс, а не каждого потока...
некая прога может запустить один поток, чтоб не грузить проц; и все, эмуляция многопоточности.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.09.2011, 20:35
Помогаю со студенческими работами здесь

Создать и синхронизировать потоки в программе
Как создать и синхронизировать потоки в программе using System; using System.Collections.Generic;...

Необходимо синхронизировать потоки (написать свой ThreadPool)
Надо написать свой ThreadPool. Идея начальная проста: есть очередь задач, которая подаётся на...

Не удается правильно синхронизировать потоки, критическая секция
доброго времени суток. необходимо синхронизировать n = 2,4,8,16 потоков чтения записи...

Как синхронизировать потоки?
Есть метод с параметрами, данный метод будет использоваться в трех разных потоках. Параметры...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru