powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Обмен между потоками в gcc
28 сообщений из 28, показаны все 2 страниц
Обмен между потоками в gcc
    #39414682
Mari.P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делала многопоточную прогу давно под 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
Обмен между потоками в gcc
    #39414700
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mari.Pвместе с тем головной поток может в любой момент модифицировать эту информацию
скажем флаг bKill. А как организовать обмен данными между потоками
в Linux под gcc, pthread_t?
Для булевой переменной - точно так же. Только метку volatile не забудьте.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Обмен между потоками в gcc
    #39414718
Mari.P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

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

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


Между потоками нигде не нужно организовывать обмен данными, все данные программы доступны во всех её потоках.
В этом и отличие потоков от процессов.
...
Рейтинг: 0 / 0
Обмен между потоками в gcc
    #39415304
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Обмен между потоками в gcc
    #39415395
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZРаз уж приложение на C++, то пора бы забивать на pthread и пользоваться стандартной
библиотекой.

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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


Но зачем писать ее каждый раз - не понятно...
...
Рейтинг: 0 / 0
Обмен между потоками в gcc
    #39415826
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Обмен между потоками в gcc
    #39416002
Mari.P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Да, спасибо большое, man открыла, все получилось, еще понятнее, чем под Windows
...
Рейтинг: 0 / 0
Обмен между потоками в gcc
    #39416685
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
Обмен между потоками в gcc
    #39416707
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mari.P(ждать их корректного завершения мне необязательно)
Ждать обязательно.
...
Рейтинг: 0 / 0
Обмен между потоками в gcc
    #39416709
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Обмен между потоками в gcc
    #39416728
Mari.P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZ,

Спасибо. Да количество потоков у меня ограничено - кол-во одновременно открытых UDP сессий не превышает 20.
А зачем ждать? В винде дочерние потоки завершаются вместе с основным, в linux не так? Остаются висеть?
...
Рейтинг: 0 / 0
Обмен между потоками в gcc
    #39416735
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mari.PNekZ,

Спасибо. Да количество потоков у меня ограничено - кол-во одновременно открытых UDP сессий не превышает 20.
А зачем ждать? В винде дочерние потоки завершаются вместе с основным, в linux не так? Остаются висеть?
Если мне не изменяет память, то это необходимо для корректного завершения потока, а не просто "выбивания почвы у него из под ног".
Если тебе не важно когда завершаются потоки, то проще делать сразу pthread_detach после создания.
...
Рейтинг: 0 / 0
Обмен между потоками в gcc
    #39416782
Mari.P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZ,

Мне важно, чтобы все потоки завершились вместе с завершением головной программы.
Это главное. В какой стадии выполнения будут потоки на момент завершения мне абсолютно не важно.
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Обмен между потоками в gcc
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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