Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / организация многопоточной программы / 12 сообщений из 12, страница 1 из 1
23.03.2017, 09:33
    #39425421
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.
 msec=0;
 while(1)
  {
   // bingo! new packet is find
   if(tmp->flag_new_packet==true)
   {  // work with packet
     ......................................
    tmp->flag_new_packet=false;
     break;
   }
  usleep(50000); //delay 50ms
  msec++;
 if(msec==140) //7 sec
 { // break for timeout 
   break;
 }
 }// end while



Подскажите пожалуйста уважаемые профессионалы, так правильно писать, или использование функции usleep вместо прерывания это не хорошо?
...
Рейтинг: 0 / 0
23.03.2017, 09:38
    #39425427
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
организация многопоточной программы
Не надо никаких sleep.
Есть std::condition_variable для того чтобы один поток будил второй.
...
Рейтинг: 0 / 0
23.03.2017, 13:19
    #39425721
Mari.P
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
организация многопоточной программы
Dima T, спасибо, а где можно исходники глянуть? Этот класс ведь на POSIX pthread базируется?
...
Рейтинг: 0 / 0
23.03.2017, 15:40
    #39425889
ermak.nn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
организация многопоточной программы
Mari.P,
http://en.cppreference.com/w/cpp/thread/condition_variable

timed_wait надо использовать, насколько я помню. но они страдают sporadic wake up, так что флаг все равно надо проверять. если флаг меняется из разных потоков, то необходимо использовать ключевое слово volatile
...
Рейтинг: 0 / 0
23.03.2017, 15:45
    #39425898
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
организация многопоточной программы
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.
 msec=0;
 while(1)
  {
   // bingo! new packet is find
   if(tmp->flag_new_packet==true)
   {  // work with packet
     ......................................
    tmp->flag_new_packet=false;
     break;
   }
  usleep(50000); //delay 50ms
  msec++;
 if(msec==140) //7 sec
 { // break for timeout 
   break;
 }
 }// end while



Подскажите пожалуйста уважаемые профессионалы, так правильно писать, или использование функции usleep вместо прерывания это не хорошо?
А что такое "прерывание" применительно к вашему коду?
...
Рейтинг: 0 / 0
23.03.2017, 18:45
    #39426024
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
организация многопоточной программы
Mari.PDima T, спасибо, а где можно исходники глянуть? Этот класс ведь на POSIX pthread базируется?
Зачем исходники? Не хочешь std::condition_variable, т.е. С++11, возьми родной линуксовый condition_variable, суть таже, эта конструкция оттуда в С++ пришла.
...
Рейтинг: 0 / 0
23.03.2017, 22:37
    #39426123
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
организация многопоточной программы
ermak.nnесли флаг меняется из разных потоков, то необходимо использовать ключевое слово volatileключевое слово volatile использовать ненадо. чтобы безопстно менять какую-то переменную из разных потов, нужно использоавть, например, std::atomic . есть еще atomic_flag.
volatile говорит компилятору что эта память - специальная память и к ней не применимы обычные оптимизации. это нужно, например, при программировании микроконтролеров. если, к примеру, значение, записанное в переменную, обозначает сколько вольт нужно подать на ножку (а не что должна содержать эта память). поэтому запись в духе i=1;i=2;i=3; будет значить что нужно повышать напряжение. без volatile компилятор оставит только последнее выражение, так как первых два бесполезны при обычной памяти.

суть: volatile никак не поможет в условиях гонки. его использовать не нужно.
зы: std::atomic иногда тоже понимают не верно. атомарной будет только одна операция. нельзя, например, создать потокобезопастный вектор в духе std::atomic<std::vector<int>> . между двумя обращениями к элементу, вполне может вклинится другой поток.
...
Рейтинг: 0 / 0
24.03.2017, 06:48
    #39426211
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
организация многопоточной программы
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 соединение, и каждый пакет (!) требует взаимодействие между потоками, зачем?

обычно делают по потоку на обработку каждого сокета, т. е. по дочерниму потоку на одно соединение клиент сервер, и там обрабатывают все, что связано с этим соединением.
...
Рейтинг: 0 / 0
24.03.2017, 06:54
    #39426212
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
организация многопоточной программы
Mari.P
Подскажите пожалуйста уважаемые профессионалы, так правильно писать, или использование функции usleep вместо прерывания это не хорошо?

Использовать голую память для синхронизации потоков - вот это нехорошо.
Нужны event или condition variable или atomic.
Это уже сказано.
...
Рейтинг: 0 / 0
24.03.2017, 06:57
    #39426213
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
организация многопоточной программы
Mari.P,

там есть еще проблема, как бы если главный поток будет слушать UDP пакеты от конкретного сокета , то как будут устанавливаться новые соединения, кто будет делать listen?
...
Рейтинг: 0 / 0
24.03.2017, 07:26
    #39426225
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
организация многопоточной программы
MasterZivтам есть еще проблема, как бы если главный поток будет слушать UDP пакеты от конкретного сокета , то как будут устанавливаться новые соединения, кто будет делать listen?
Ты с TCP путаешь, в UDP нет соединений, все пакеты в один сокет приходят, recvfrom() кроме пакета дает еще адрес откуда он прилетел.
...
Рейтинг: 0 / 0
24.03.2017, 10:22
    #39426320
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
организация многопоточной программы
Dima TMasterZivтам есть еще проблема, как бы если главный поток будет слушать UDP пакеты от конкретного сокета , то как будут устанавливаться новые соединения, кто будет делать listen?
Ты с TCP путаешь, в UDP нет соединений, все пакеты в один сокет приходят, recvfrom() кроме пакета дает еще адрес откуда он прилетел.

Да, ты прав.
Короче, был неправ, вспылил...
Всё вышесказанное прошу считать бредом.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / организация многопоточной программы / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]