Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
организация многопоточной программы
|
|||
|---|---|---|---|
|
#18+
дано: linux debian 8.3, программа на gcc-4.9, использует pthread. Программа работает нормально, но есть сомнения. головной поток караулит пакеты на порту UDP xxx, при получении пакета ищет по IP-адресу отправителя дочерний поток, который работает с этим IP и ставит в структуре, передаваемой потоку flag_new_packet=true; соответственно в дочернем потоке реализован цикл, который ждет пока flag_new_packet станет true, чтобы начать обрабатывать пакет от IP: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Подскажите пожалуйста уважаемые профессионалы, так правильно писать, или использование функции usleep вместо прерывания это не хорошо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2017, 09:33 |
|
||
|
организация многопоточной программы
|
|||
|---|---|---|---|
|
#18+
Не надо никаких sleep. Есть std::condition_variable для того чтобы один поток будил второй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2017, 09:38 |
|
||
|
организация многопоточной программы
|
|||
|---|---|---|---|
|
#18+
Dima T, спасибо, а где можно исходники глянуть? Этот класс ведь на POSIX pthread базируется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2017, 13:19 |
|
||
|
организация многопоточной программы
|
|||
|---|---|---|---|
|
#18+
Mari.P, http://en.cppreference.com/w/cpp/thread/condition_variable timed_wait надо использовать, насколько я помню. но они страдают sporadic wake up, так что флаг все равно надо проверять. если флаг меняется из разных потоков, то необходимо использовать ключевое слово volatile ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2017, 15:40 |
|
||
|
организация многопоточной программы
|
|||
|---|---|---|---|
|
#18+
Mari.Pдано: linux debian 8.3, программа на gcc-4.9, использует pthread. Программа работает нормально, но есть сомнения. головной поток караулит пакеты на порту UDP xxx, при получении пакета ищет по IP-адресу отправителя дочерний поток, который работает с этим IP и ставит в структуре, передаваемой потоку flag_new_packet=true; соответственно в дочернем потоке реализован цикл, который ждет пока flag_new_packet станет true, чтобы начать обрабатывать пакет от IP: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Подскажите пожалуйста уважаемые профессионалы, так правильно писать, или использование функции usleep вместо прерывания это не хорошо? А что такое "прерывание" применительно к вашему коду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2017, 15:45 |
|
||
|
организация многопоточной программы
|
|||
|---|---|---|---|
|
#18+
Mari.PDima T, спасибо, а где можно исходники глянуть? Этот класс ведь на POSIX pthread базируется? Зачем исходники? Не хочешь std::condition_variable, т.е. С++11, возьми родной линуксовый condition_variable, суть таже, эта конструкция оттуда в С++ пришла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2017, 18:45 |
|
||
|
организация многопоточной программы
|
|||
|---|---|---|---|
|
#18+
ermak.nnесли флаг меняется из разных потоков, то необходимо использовать ключевое слово volatileключевое слово volatile использовать ненадо. чтобы безопстно менять какую-то переменную из разных потов, нужно использоавть, например, std::atomic . есть еще atomic_flag. volatile говорит компилятору что эта память - специальная память и к ней не применимы обычные оптимизации. это нужно, например, при программировании микроконтролеров. если, к примеру, значение, записанное в переменную, обозначает сколько вольт нужно подать на ножку (а не что должна содержать эта память). поэтому запись в духе i=1;i=2;i=3; будет значить что нужно повышать напряжение. без volatile компилятор оставит только последнее выражение, так как первых два бесполезны при обычной памяти. суть: volatile никак не поможет в условиях гонки. его использовать не нужно. зы: std::atomic иногда тоже понимают не верно. атомарной будет только одна операция. нельзя, например, создать потокобезопастный вектор в духе std::atomic<std::vector<int>> . между двумя обращениями к элементу, вполне может вклинится другой поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2017, 22:37 |
|
||
|
организация многопоточной программы
|
|||
|---|---|---|---|
|
#18+
Mari.Pдано: linux debian 8.3, программа на gcc-4.9, использует pthread. Программа работает нормально, но есть сомнения. головной поток караулит пакеты на порту UDP xxx, при получении пакета ищет по IP-адресу отправителя дочерний поток, который работает с этим IP и ставит в структуре, передаваемой потоку flag_new_packet=true; соответственно в дочернем потоке реализован цикл, который ждет пока flag_new_packet станет true, чтобы начать обрабатывать пакет от IP: вообще схема думаю ненормальная, у тебя получается по два потока на udp/ip соединение, и каждый пакет (!) требует взаимодействие между потоками, зачем? обычно делают по потоку на обработку каждого сокета, т. е. по дочерниму потоку на одно соединение клиент сервер, и там обрабатывают все, что связано с этим соединением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2017, 06:48 |
|
||
|
организация многопоточной программы
|
|||
|---|---|---|---|
|
#18+
Mari.P Подскажите пожалуйста уважаемые профессионалы, так правильно писать, или использование функции usleep вместо прерывания это не хорошо? Использовать голую память для синхронизации потоков - вот это нехорошо. Нужны event или condition variable или atomic. Это уже сказано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2017, 06:54 |
|
||
|
организация многопоточной программы
|
|||
|---|---|---|---|
|
#18+
Mari.P, там есть еще проблема, как бы если главный поток будет слушать UDP пакеты от конкретного сокета , то как будут устанавливаться новые соединения, кто будет делать listen? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2017, 06:57 |
|
||
|
организация многопоточной программы
|
|||
|---|---|---|---|
|
#18+
MasterZivтам есть еще проблема, как бы если главный поток будет слушать UDP пакеты от конкретного сокета , то как будут устанавливаться новые соединения, кто будет делать listen? Ты с TCP путаешь, в UDP нет соединений, все пакеты в один сокет приходят, recvfrom() кроме пакета дает еще адрес откуда он прилетел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2017, 07:26 |
|
||
|
организация многопоточной программы
|
|||
|---|---|---|---|
|
#18+
Dima TMasterZivтам есть еще проблема, как бы если главный поток будет слушать UDP пакеты от конкретного сокета , то как будут устанавливаться новые соединения, кто будет делать listen? Ты с TCP путаешь, в UDP нет соединений, все пакеты в один сокет приходят, recvfrom() кроме пакета дает еще адрес откуда он прилетел. Да, ты прав. Короче, был неправ, вспылил... Всё вышесказанное прошу считать бредом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2017, 10:22 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39425898&tid=2018233]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
185ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 287ms |
| total: | 580ms |

| 0 / 0 |
