Название: синхронизировать потоки и libpcap Отправлено: verona от Январь 10, 2013, 10:23 привет всем.
правильно ли я синхронизирую потоки? мне нужно, чтобы потоки thread1 и thread2 выполнялись строго поочередно: код главного gui потока: Код: class MainWidget : public QWidget Код: #include <QThread> Код: void thread1::run() Код: #include <QThread> Код: void thread2::run() правильно ли я делаю синхронизацию? . дело в том, что поток thread1 используется для приема пакетов по сети с помощью libpcap, и возможно из-за нее вылазит ошибка. Название: Re: синхронизировать потоки и libpcap Отправлено: Igors от Январь 10, 2013, 10:59 правильно ли я делаю синхронизацию? . Вы ее не делаете :) Да, Вы защитили участки кода мутексом, но нет гарантий что обработчик (thread2) захватит мутекс и начнет делать func1(2, 3) уже после того как данные считаны. Можно использовать семафорыКод
Название: Re: синхронизировать потоки и libpcap Отправлено: Old от Январь 10, 2013, 11:00 правильно ли я делаю синхронизацию? . Нет.В таких задачах взаимодействует поток-производитель, поток-потребитель и данные, которые и нужно защищать. Если хочешь разобраться, то сделай просто тестовую программку, без pcap, и на ней уже пробуй. Название: Re: синхронизировать потоки и libpcap Отправлено: Old от Январь 10, 2013, 11:06 Можно использовать семафоры для получения бесполезной многозадачности? :)Пока одна нитка выполняется, другая всегда стоит, а ядро тратим время на переключение контекстов. Название: Re: синхронизировать потоки и libpcap Отправлено: Igors от Январь 10, 2013, 11:11 для получения бесполезной многозадачности? :) Да, но таково условие задачиПока одна нитка выполняется, другая всегда стоит, а ядро тратим время на переключение контекстов. мне нужно, чтобы потоки thread1 и thread2 выполнялись строго поочередно: Название: Re: синхронизировать потоки и libpcap Отправлено: Old от Январь 10, 2013, 11:17 Да, но таково условие задачи Это условие вытекает из плохого знания предмета топикстартером. В такой многозадачности просто нет смысла. :)Название: Re: синхронизировать потоки и libpcap Отправлено: Igors от Январь 10, 2013, 11:28 Это условие вытекает из плохого знания предмета топикстартером. В такой многозадачности просто нет смысла. :) Это утверждение слишком категорично. Напр если обработчиков 2 или более - все вполне разумноНазвание: Re: синхронизировать потоки и libpcap Отправлено: Old от Январь 10, 2013, 11:31 Это утверждение слишком категорично. Разве?Напр если обработчиков 2 или более - все вполне разумно Как это может соотноситься сЦитировать мне нужно, чтобы потоки thread1 и thread2 выполнялись строго поочередно: :)Хорошо, пусть будет 2 (или более) потока, которые должны выполняться строго один за другим и при выполнении одного, другой (другие) должны стоять и ждать. В чем смысл этого разделения, если все равно код выполняется последовательно и лучше всего будет выполняться в одном потоке, т.к. там не будет побочных потерь на переключение контекста потоков. :) Название: Re: синхронизировать потоки и libpcap Отправлено: verona от Январь 10, 2013, 13:54 правильно ли я делаю синхронизацию? . Вы ее не делаете :) Да, Вы защитили участки кода мутексом, но нет гарантий что обработчик (thread2) захватит мутекс и начнет делать func1(2, 3) уже после того как данные считаны. Можно использовать семафорыКод
я уже отключил все другие модули программы, сейчас только обозначенные потоки работают без всяких лишних операций и ... по прежнему не работает. Название: Re: синхронизировать потоки и libpcap Отправлено: verona от Январь 10, 2013, 13:56 Да, но таково условие задачи Это условие вытекает из плохого знания предмета топикстартером. В такой многозадачности просто нет смысла. :)Название: Re: синхронизировать потоки и libpcap Отправлено: Old от Январь 10, 2013, 15:56 в будущем предполагается сделать circular buffer В каком будущем? :)То что ты пытаешься сделать - это вообще не решение. Ты однопоточное решение хочешь разбить на несколько потоков, так не получиться, оно по прежнему будет однопоточное. Нужна очередь, куда поток слушающий pcap будет складывать данные, а один или несколько потоков-обработчиков будут эти данные из очереди брать и обрабатывать. Название: Re: синхронизировать потоки и libpcap Отправлено: kuzulis от Январь 10, 2013, 16:27 Я ему уже посоветовал в другом его топике вообще отказаться от потоков, или использовать один отдельный поток для перехвата траффика через PCAP.
Тогда лучше всего работать с PCAP в неблокирующем режиме через QSocketNotifier и использовать сигналы/слоты, я ему даже дал ссылку на Qt wrapper для PCAP (для Linux). Но ТС упорно продолжает гнуть свою линию с какой-то хренотенью в которой не разбирается и все усложняет. :-\ Мда... Название: Re: синхронизировать потоки и libpcap Отправлено: Igors от Январь 10, 2013, 18:55 Но ТС упорно продолжает гнуть свою линию с какой-то хренотенью в которой не разбирается и все усложняет. :-\ Вполне возможно (и даже очень вероятно) что предложенное Вами решение по-любому лучше. Но все же не стоит его навязывать. В этой теме человек спросил конкретный вопрос - ну и дадим конкретный ответ. А "зачем так делать" - то его проблемы, вот спросит как лучше, тогда и ответим :)сделал как показали через семафоры, единственное объявил их как public члены mainwidget, соот-во доступ к ним из потоков происходит вот так: mw->semaphore1... Впечатление что Вы как-то легкомысленно относитесь к архитектуре своего приложения. Быстренько попробовать - ага, не получилось, значит другое попробовать и.т.д. Разбираться надо где, что и как не работает.я уже отключил все другие модули программы, сейчас только обозначенные потоки работают без всяких лишних операций и ... по прежнему не работает. Название: Re: синхронизировать потоки и libpcap Отправлено: verona от Январь 18, 2013, 13:59 Я ему уже посоветовал в другом его топике вообще отказаться от потоков, или использовать один отдельный поток для перехвата траффика через PCAP. Тогда лучше всего работать с PCAP в неблокирующем режиме через QSocketNotifier и использовать сигналы/слоты, я ему даже дал ссылку на Qt wrapper для PCAP (для Linux). Но ТС упорно продолжает гнуть свою линию с какой-то хренотенью в которой не разбирается и все усложняет. :-\ Мда... а как решить проблему с высокой загрузкой CPU ? |