Зависает при многопоточности

ldar
Дата: 05.05.2014 11:15:13
Доброе время суток.Помогите советом, несколько дней бьюсь, все перепробовал. Никак не могу разобраться в чем проблема, есть dll, которая забирает данные с устройств по TCPIP при однопоточности все норм, а при использовании многопоточности все зависает, а иногда и проскакивает и к тому же не все потоки отрабатывают... В чем может быть причина?
Код не сложный:
 class Program
    {
        public static int Main(string[] args)
        {

            BBB c1 = new BBB();
            BBB c2 = new BBB();
            BBB c3 = new BBB();
            BBB c4 = new BBB();
            BBB c5 = new BBB();
            Parallel.Invoke(c1.W, c2.W, c3.W, c4.W, c5.W);

            Console.ReadKey();
            return 0;
        }
        class BBB
        {
            libnodave.daveOSserialType fds;
            libnodave.daveInterface di;
            libnodave.daveConnection Connect;
            private Object thisLock = new Object();
           public BBB()
           {
               Console.WriteLine("Сокет {0}", Task.CurrentId);
               fds.rfd = libnodave.openSocket(102, "192.168.4.115");
               fds.wfd = fds.rfd;
               if (fds.rfd > 0)
               {
                   di = new libnodave.daveInterface(fds, "IF1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k);
                   di.setTimeout(1000);
                   Connect = new libnodave.daveConnection(di, 0, 0, 2);
                   Connect.connectPLC();
               }
               else
                   Console.WriteLine("Ошибка в потоке {0}", Task.CurrentId);
           }
            public void W()
            {
                    for (int y = 0; y < 1;y++ )
                    {
                        using (libnodave.PDU p = Connect.prepareReadRequest())
                        {
                            p.addVarToReadRequest(libnodave.daveDB, 102, 2, 3);
                            p.addVarToReadRequest(libnodave.daveDB, 102, 6, 3);
                            using (libnodave.resultSet rl = new libnodave.resultSet())
                            {
                                    Connect.execReadRequest(p, rl);
                                    for (int x = 0; x < 19; x++)
                                    {
                                        if (Connect.useResult(rl, x) == 0)
                                        {
                                            Console.WriteLine("Значение{0}|{1}:{2}|{3}|{4}", 1, x + 1, Connect.getFloat(), DateTime.Now.ToString("mm:ss.fff"), Task.CurrentId);
                                        }
                                        else
                                            Console.WriteLine("Error");
                                    }
                                 
                                
                            }
                        }
                    }
                
            }
        }
    }
ldar
Дата: 05.05.2014 11:17:47
Как понял, зависает при вызове функции Connect.execReadRequest(p, rl);
Где-то в степи
Дата: 05.05.2014 11:49:06
ldar,
автор
при однопоточности все норм, а при использовании многопоточности

не понял, при какой много поточности? на ой стороне, при передаче, или многопоточность на приеме?
ldar
Дата: 05.05.2014 11:57:54
Где-то в степи, при приеме. Мной используемая dll опрашивает удаленные контроллеры по TCPIP.
При опросе в один поток, все нормально, но медленно, решил сделать многопоточность, зависает.
ldar
Дата: 05.05.2014 11:59:53
Еще, если к примеру сделать 2 потока, то отрабатывает, 3 потока отрабатывает чаще, а если больше 4х зависает.
Где-то в степи
Дата: 05.05.2014 12:03:54
ldar,
кто вам посоветовал эту реализацию - убейте ( или друга или мозг)
ldar
Дата: 05.05.2014 12:12:17
Где-то в степи, убиваю свой мозг.
А в чем собственно ошибка, я новичок...
petalvik
Дата: 05.05.2014 12:16:16
ldar,

если на приём идёт один поток данных на один порт, то и принимать его можно только в один поток.

Зависает, я думаю, по классической причине гонки: один поток начинает чтение данных, потом другой поток дочитывает эти данные, а первому уже не остаётся, но он продолжает ждать их.
ldar
Дата: 05.05.2014 12:20:17
petalvik,
На немецком форуме обсуждающие эту библиотеку пишут, что используют в многопоточности до 50 потоков. Но увы не приводят примеры, а я не знаю немецкого чтоб правильно задать им вопрос)...
Где-то в степи
Дата: 05.05.2014 12:23:35
ldar,
сокет -> Слушатель ( ваша длл)->(ложим задание)потоконезависимая очередь -> пул потоков, которые берут задания из очереди