многопоточность - два вопроса
От: abb269  
Дата: 15.11.10 12:22
Оценка:
Здравствуйте,
Помогите разобраться с многопоточностью не самому профессиональному программисту.
Есть внешний источник посылающий данные в формате string name/string line. Нужно принимать и обрабатывать эти данные с максимально возможным быстродействием.
Попытка применить что-то вроде
            switch (name)
            {
                case "a":
                    Thread tA = new Thread(GetA);
                    tA.Start(line);
                    break;
                case "b":
                    Thread tB = new Thread(GetB);
                    tB.Start(line);
                    break;
            }

с последующей обработкой в Get... работает неадекватно.
Посоветуйте, пожалуйста, в какую сторону нужно смотреть.
Это глобальный, можно сказать вопрос.
Но в процессе моих войн с многопоточностью образовался и еще один, маленький.
Можно ли исправить такой вот код

        static void Main(string[] args)
        {
            for (int i = 1; i<=10; i++)
            {
                string line = i.ToString();
                Thread t = new Thread(Go);
                t.Start(line);
                t.Join();
            }
            Console.ReadLine();
        }

        static void Go(object o)
        {
            Thread.Sleep(5000);
            Console.WriteLine((string)o);
        }


чтобы он напечатал цифры в правильной последовательности меньше, чем за 5*10 секунд?
Заранее спасибо.
Re: многопоточность - два вопроса
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 15.11.10 12:45
Оценка:
Здравствуйте, abb269, Вы писали:

A>Здравствуйте,

A>Помогите разобраться с многопоточностью не самому профессиональному программисту.
A>Есть внешний источник посылающий данные в формате string name/string line. Нужно принимать и обрабатывать эти данные с максимально возможным быстродействием.
A>Попытка применить что-то вроде
A>
A>            switch (name)
A>            {
A>                case "a":
A>                    Thread tA = new Thread(GetA);
A>                    tA.Start(line);
A>                    break;
A>                case "b":
A>                    Thread tB = new Thread(GetB);
A>                    tB.Start(line);
A>                    break;
A>            }

A>

A>с последующей обработкой в Get... работает неадекватно.
A>Посоветуйте, пожалуйста, в какую сторону нужно смотреть.
A>Это глобальный, можно сказать вопрос.
A>Но в процессе моих войн с многопоточностью образовался и еще один, маленький.
A>Можно ли исправить такой вот код

Если нужна эффективность то лучше бы использовать Task Parallel Lubrary ...
хотя нужно знать сколько запросов за единицу времени поступает и как долго выполняется обработка

A>
A>        static void Main(string[] args)
A>        {
A>            for (int i = 1; i<=10; i++)
A>            {
A>                string line = i.ToString();
A>                Thread t = new Thread(Go);
A>                t.Start(line);
A>                t.Join();
A>            }
A>            Console.ReadLine();
A>        }

A>        static void Go(object o)
A>        {
A>            Thread.Sleep(5000);
A>            Console.WriteLine((string)o);
A>        }

A>


A>чтобы он напечатал цифры в правильной последовательности меньше, чем за 5*10 секунд?


Join блокирует текущий поток пока t не завершит работу, следует вызывать Join вне тела цикла (например, сохранять потоки в списке и потом пробегаться по нему)

A>Заранее спасибо.
Re[2]: многопоточность - два вопроса
От: abb269  
Дата: 15.11.10 13:09
Оценка:
A>Если нужна эффективность то лучше бы использовать Task Parallel Lubrary ...
A>хотя нужно знать сколько запросов за единицу времени поступает и как долго выполняется обработка

Данные поступают раз в 0,1 сек (в худшем случае), данные обрабатываются примерно столько же.

A>Join блокирует текущий поток пока t не завершит работу, следует вызывать Join вне тела цикла (например, сохранять потоки в списке и потом пробегаться по нему)


Про сохранение потоков в списке не совсем понятно. Сохранять следует имена потоков?

Спасибо.
Re[3]: многопоточность - два вопроса
От: Jolly Roger  
Дата: 15.11.10 14:45
Оценка:
Здравствуйте, abb269, Вы писали:

A>Данные поступают раз в 0,1 сек (в худшем случае), данные обрабатываются примерно столько же.


Это "примерно" в данном случае имеет принципиальное значение. Если оно всегда меньше 0,1 сек, то Вам нужен только один поток. Если же больше, то на одном процессоре Вы никак не управитесь, и никакое количество доп. потоков Вам не поможет. Нужно минимум два процессора и два потока, каждый из которых работает в цикле, на вход принимает данные, и сам хоть тем же свичем передаёт их подходящим методам обработки. Создавать потоки на каждый входящий пакет не нужно. Но проще всего использовать ThreadPool, связав с ним транспорт, по которому получаете входные данные.
"Нормальные герои всегда идут в обход!"
Re[3]: многопоточность - два вопроса
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 16.11.10 06:36
Оценка:
Здравствуйте, abb269, Вы писали:

A>Про сохранение потоков в списке не совсем понятно. Сохранять следует имена потоков?


Сохранять объекты типа Thread.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.