Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Обмен между потоками в gcc / 25 сообщений из 28, страница 1 из 2
06.03.2017, 13:28
    #39414682
Mari.P
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Делала многопоточную прогу давно под Windows, Visual Studio, MFC
там все просто: передаем потоку при создании некую информацию,
вместе с тем головной поток может в любой момент модифицировать эту информацию
скажем флаг bKill. А как организовать обмен данными между потоками
в Linux под gcc, pthread_t?



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
extern CNServerApp theApp;
// список портов
    CPtrList PortList;


PointCKP=new CKP();
  PointCKP->Dsp_Number=(unsigned char)YkytSet.m_KpID;
  ArrKP[PointCKP->Dsp_Number]=TRUE;
  PointCKP->Net_Number=YkytSet.m_NetNum;
  PointCKP->port=YkytSet.m_Port;
  PointCKP->Prot=YkytSet.m_IDMOD;




// создадим структуру портов
    pos = theApp.KPList.GetHeadPosition();
	while (pos != NULL)
	{   
		PointCKP=(CKP *)theApp.KPList.GetAt(pos);
		pos1=theApp.PortList.GetHeadPosition();
		AddPort=TRUE;
		while (pos1 != NULL)
        { PPort=(PPARAMS)theApp.PortList.GetAt(pos1);
		 if(PointCKP->port==PPort->port)
		 {AddPort=FALSE;break;}
		 else theApp.PortList.GetNext(pos1);
		}
        if(AddPort==TRUE)
		{ PPort=new PARAMS();
		  PPort->bKill=FALSE;
          PPort->port=PointCKP->port;
		  theApp.PortList.AddTail(PPort);
        } 
		theApp.KPList.GetNext(pos);
	}



// запускаем потоки с портами
pos1=theApp.PortList.GetHeadPosition();
while (pos1 != NULL)
{ PPort=(PPARAMS)theApp.PortList.GetAt(pos1);
  _beginthread (Thread2,0,PPort);
  theApp.PortList.GetNext(pos1);
}





//////////////////////////////////////////////////////////////
//        Текст основной функции
//////////////////////////////////////////////////////////////
void _cdecl Thread2 (PVOID pvoid)
{
 PPARAMS pparams_new;    

 POSITION pos;
 CKP * PointCKP;
 
 
  pparams_new = (PPARAMS) pvoid ;

// Основной цикл 
  while (!pparams_new->bKill)
  {
 pos = theApp.KPList.GetHeadPosition();
 while (pos != NULL)
 { PointCKP=(CKP *)theApp.KPList.GetAt(pos);
   if(pparams_new->port==PointCKP->port)
   {   
	// делаем что-то
   }
   
   theApp.KPList.GetNext(pos);
 }

 } // end while 

_endthread () ;

}// end функции Thread
...
Рейтинг: 0 / 0
06.03.2017, 13:44
    #39414700
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Mari.Pвместе с тем головной поток может в любой момент модифицировать эту информацию
скажем флаг bKill. А как организовать обмен данными между потоками
в Linux под gcc, pthread_t?
Для булевой переменной - точно так же. Только метку volatile не забудьте.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.03.2017, 14:02
    #39414718
Mari.P
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Dimitry Sibiryakov,

Спасибо, а для остальных типов переменных?
как скажем передать из потока в поток данные структуры
struct sockaddr_in ?
...
Рейтинг: 0 / 0
06.03.2017, 14:10
    #39414735
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Mari.Pкак скажем передать из потока в поток данные структуры struct sockaddr_in ?

Точно так же: через параметр функции потока. Откройте уже для себя man.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.03.2017, 18:04
    #39414928
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Mari.Pпередаем потоку при создании некую информацию,
вместе с тем головной поток может в любой момент модифицировать эту информацию
скажем флаг bKill. А как организовать обмен данными между потоками
в Linux под gcc, pthread_t?


Между потоками нигде не нужно организовывать обмен данными, все данные программы доступны во всех её потоках.
В этом и отличие потоков от процессов.
...
Рейтинг: 0 / 0
07.03.2017, 11:09
    #39415304
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Dimitry SibiryakovMari.Pвместе с тем головной поток может в любой момент модифицировать эту информацию
скажем флаг bKill. А как организовать обмен данными между потоками
в Linux под gcc, pthread_t?
Для булевой переменной - точно так же. Только метку volatile не забудьте.


Пора уже прекратить есть руками с начала C++11. Там есть std::atomic_flag/std::atomic_bool для таких целей. atomic_flag гарантированно всегда атомарен.

Раз уж приложение на C++, то пора бы забивать на pthread и пользоваться стандартной библиотекой. Обмен между потоками можно организовать несколькими путями:
1. Через комбинацию std::promise/std::future;
2. Через потокобезопасные типы/атомики;
3. Разделяемые данные, защищённые мьютексами в комбинации с condition_variable.
...
Рейтинг: 0 / 0
07.03.2017, 12:48
    #39415395
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
NekZРаз уж приложение на C++, то пора бы забивать на pthread и пользоваться стандартной
библиотекой.

Не всем нравятся прыжки в ширину и тонны говнокода. А некоторые заботятся и о
производительности.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.03.2017, 13:02
    #39415410
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Dimitry SibiryakovНе всем нравятся прыжки в ширину и тонны говнокода. А некоторые заботятся и о
производительности .

Я считаю, что пока проект не разросся в несколько десятков тысяч строк, ещё не поздно отрефакторить под современные реалии, чтобы не продолжать накидывать архаичный код.

А причём тут производительность?
...
Рейтинг: 0 / 0
07.03.2017, 13:48
    #39415466
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
NekZА причём тут производительность?
Вопрос на засыпку: мутексы в стандартной библиотеке С++ реализованы через мутексы, футексы
или критические секции?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.03.2017, 14:10
    #39415485
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Dimitry SibiryakovВопрос на засыпку: мутексы в стандартной библиотеке С++ реализованы через мутексы, футексы
или критические секции?

Вопрос невалидный, реализация ОС-специфичных потрохов полностью implementation-defined.
В gcc, ЕМНИМ используется pthread под капотом. И что с того?
...
Рейтинг: 0 / 0
07.03.2017, 14:17
    #39415499
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
NekZИ что с того?
То-то и оно, что ты не знаешь что там под капотом, а потому не можешь определить почему
программа жрёт 100% процессора, но при этом тормозит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.03.2017, 14:37
    #39415520
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Dimitry SibiryakovТо-то и оно, что ты не знаешь что там под капотом, а потому не можешь определить почему
программа жрёт 100% процессора , но при этом тормозит.

Наверное, live lock ;-)

А если по делу, то какой-то мутный аргумент против стандартной библиотеки. То же самое можно сказать про любые плюсовые обвязки threading либ (boost, Qt).
...
Рейтинг: 0 / 0
07.03.2017, 15:02
    #39415542
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
NekZТо же самое можно сказать про любые плюсовые обвязки threading либ (boost, Qt).

Да. И именно поэтому лично я их не использую и не планирую использовать даже в новых
проектах. Не хочу ради призрачной цели "один код для всех платформ" тренироваться в беге
на месте с препятствиями.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.03.2017, 15:36
    #39415585
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Dimitry SibiryakovДа. И именно поэтому лично я их не использую и не планирую использовать даже в новых
проектах. Не хочу ради призрачной цели "один код для всех платформ" тренироваться в беге
на месте с препятствиями.

Как ты понимаешь, у такого подхода свои минусы, и далеко не всё сообщество C++ готово с ними мириться.
...
Рейтинг: 0 / 0
07.03.2017, 17:22
    #39415629
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Dimitry SibiryakovNekZТо же самое можно сказать про любые плюсовые обвязки threading либ (boost, Qt).

Да. И именно поэтому лично я их не использую и не планирую использовать даже в новых
проектах. Не хочу ради призрачной цели "один код для всех платформ" тренироваться в беге
на месте с препятствиями.
А что внутри pthread? А что в ядре ОС? И что там компилятор нагенерит? Нет, только ассемблер, только bare metal, только хардкор.
...
Рейтинг: 0 / 0
07.03.2017, 17:47
    #39415643
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
BarloneА что внутри pthread? А что в ядре ОС?
В них, конечно, тоже нельзя быть уверенным, но они предоставляют гораздо больше
инструментов, чем стандартный С++, а значит есть что сравнить и выбрать наиболее
подходящий к задаче. Выше я уже упоминал мутексы, футексы и критические секции. А в другом
топике интересовался чем в стандартном С++ можно заменить WaitForMultipleObject(). Ничего
лучше бесконечного цикла с опросом состояния всех объектов предложено не было.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.03.2017, 18:11
    #39415652
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Dimitry Sibiryakovтопике интересовался чем в стандартном С++ можно заменить WaitForMultipleObject(). Ничего
лучше бесконечного цикла с опросом состояния всех объектов предложено не было.

std::condition_variable?
...
Рейтинг: 0 / 0
07.03.2017, 18:37
    #39415663
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Dimitry SibiryakovNekZРаз уж приложение на C++, то пора бы забивать на pthread и пользоваться стандартной
библиотекой.

Не всем нравятся прыжки в ширину и тонны говнокода. А некоторые заботятся и о
производительности.
Если есть конкретные проблемы с производительностью std::, выкладывай (ну кроме потоков, и так известно).
Собственно, комитет о факторе производительности не забывает. А велосипеды зачастую небыстрые
...
Рейтинг: 0 / 0
08.03.2017, 06:05
    #39415765
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Dimitry SibiryakovNekZРаз уж приложение на C++, то пора бы забивать на pthread и пользоваться стандартной
библиотекой.

Не всем нравятся прыжки в ширину и тонны говнокода. А некоторые заботятся и о
производительности.


там все более чем ок с производительностью...
...
Рейтинг: 0 / 0
08.03.2017, 06:14
    #39415766
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Dimitry Sibiryakov
топике интересовался чем в стандартном С++ можно заменить WaitForMultipleObject(). Ничего
лучше бесконечного цикла с опросом состояния всех объектов предложено не было.


там как бы немного другая модель вычислений, там WaitForMultipleObject вообще не нужен.

Если тебе по-другому никак, то да, тебе придется написать непереносимую программу


Но зачем писать ее каждый раз - не понятно...
...
Рейтинг: 0 / 0
08.03.2017, 13:47
    #39415826
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Mari.PДелала...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
....
while (pos1 != NULL)
{ PPort=(PPARAMS)theApp.PortList.GetAt(pos1);
  _beginthread (Thread2,0,PPort);
  theApp.PortList.GetNext(pos1);
}
...



Офф/2:
Оно не рабочее.
Или по другому - в тепличных условиях работать будет. Случайная нагрузка на ось и код поплывёт...
ЗЫ
Или по другому....
Т.к. поток может никогда не начаться, то нафига Вы запускаете такой поток, работоспособность которого вам пофигу????


с уважением
(круглый)
...
Рейтинг: 0 / 0
09.03.2017, 08:34
    #39416002
Mari.P
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Dimitry Sibiryakov,

Да, спасибо большое, man открыла, все получилось, еще понятнее, чем под Windows
...
Рейтинг: 0 / 0
10.03.2017, 10:36
    #39416685
Mari.P
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Уважаемые профессионалы, подскажите пожалуйста:
Linux Debian, gcc, конструкция проги такая:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
main()
{
  for(;;)
  { 
     // если получен пакет с ip-адреса запускаем поток на его обработку
     pthread_create(thread,NULL,thread_func,thread_data);
  }  
  // здесь надо ждать завершения всех потоков? 
  
}


void * thread_func(void thread_data)
{
  // обрабатываем пакеты от ip-адреса и завершаемся
  pthread_exit(0);
}



Вопрос - перед завершением головного потока надо написать pthread_join(thread, NULL);?
или дочерние потоки завершатся вместе с основным? (ждать их корректного завершения мне необязательно)
...
Рейтинг: 0 / 0
10.03.2017, 10:59
    #39416707
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Mari.P(ждать их корректного завершения мне необязательно)
Ждать обязательно.
...
Рейтинг: 0 / 0
10.03.2017, 11:03
    #39416709
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен между потоками в gcc
Mari.PУважаемые профессионалы, подскажите пожалуйста:
Linux Debian, gcc, конструкция проги такая:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
main()
{
  for(;;)
  { 
     // если получен пакет с ip-адреса запускаем поток на его обработку
     pthread_create(thread,NULL,thread_func,thread_data);
  }  
  // здесь надо ждать завершения всех потоков? 
  
}


void * thread_func(void thread_data)
{
  // обрабатываем пакеты от ip-адреса и завершаемся
  pthread_exit(0);
}



Вопрос - перед завершением головного потока надо написать pthread_join(thread, NULL);?
или дочерние потоки завершатся вместе с основным? (ждать их корректного завершения мне необязательно)
Кстати, такой код потенциально может плодить новые потоки бесконечно, что, в конечном итоге приведёт к снижению производительности из-за чрезмерного переключения контекста потоков процессором(ами). Переключение контекста -- убийца производительности.
Я бы рекомендовал использовать ограниченный пул потоков.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Обмен между потоками в gcc / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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