Читаоци попут вас помажу у подршци МУО. Када обавите куповину користећи везе на нашем сајту, можда ћемо зарадити провизију за партнере. Опширније.

На Линук-у можете креирати нити у Ц/Ц++ и управљати њима помоћу библиотеке ПОСИКС нити (птхреад). За разлику од других оперативних система, у Линуку постоји мала разлика између нити и процеса. Зато Линук често своје нити назива процесима мале тежине.

Користећи птхреад библиотеку, можете креирати нити, сачекати да се заврше и експлицитно их прекинути.

Историја коришћења нити на Линук-у

Пре Линук верзије 2.6, имплементација главне нити је била ЛинукТхреадс. Ова имплементација је имала значајна ограничења у погледу перформанси и операција синхронизације. Ограничење максималног броја нити које се могу покренути ограничило их је на 1000-их.

Године 2003, тим предвођен програмерима из ИБМ-а и РедХат-а успео је да направи Изворна ПОСИКС библиотека нити (НПТЛ) пројекат доступан. Први пут је представљен у РедХат Ентерприсе верзији 3 да би се решили проблеми са перформансама са Јава виртуелном машином на Линук-у. Данас, ГНУ Ц библиотека садржи имплементације оба механизма навоја.

instagram viewer

Ни једно ни друго није имплементација зелених нити, којима би виртуелна машина управљала и радила у чисто корисничком режиму. Када користите птхреад библиотеку, кернел креира нит сваки пут када се програм покрене.

Можете пронаћи информације специфичне за нит за било који покренути процес у датотекама испод /proc//task. Ово је стандардна локација за информације о процесу под процфс Линук стандард. За апликације са једном нити, изгледа да постоји запис задатка са истом вредношћу као ПИД у овом директоријуму.

Радна логика нити

Нити су попут процеса који се тренутно извршавају на оперативном систему. У системима са једним процесором (нпр. микроконтролери), језгро оперативног система симулира нити. Ово омогућава да се трансакције одвијају истовремено кроз сечење.

Једнојезгарни оперативни систем може заиста покренути само један по један процес. Међутим, у вишејезгарни или вишепроцесорски системи, ови процеси могу да се одвијају истовремено.

Креирање нити у Ц

Можете користити птхреад_цреате функција за креирање нове нити. Тхе птхреад.х датотека заглавља укључује дефиницију потписа заједно са другим функцијама које се односе на нити. Нити користе исти адресни простор и дескрипторе датотека као и главни програм.

Библиотека птхреад такође укључује неопходну подршку за мутек и условне операције потребне за операције синхронизације.

Када користите функције библиотеке птхреад, морате осигурати да компајлер повезује птхреад библиотеку у ваш извршни фајл. Ако је потребно, можете наложити компајлеру да се повеже са библиотеком користећи опција:

гцц -о тест тест_тхреад.ц -лптхреад

Функција птхреад_цреате има следећи потпис:

интптхреад_цреате(птхреад_т * нит, констптхреад_аттр_т *аттр, празнина *(*старт_роутине)(празнина *), празнина *арг)

Враћа 0 ако је процедура успешна. Ако постоји проблем, враћа код грешке који није нула. У горњем потпису функције:

  • Тхе конац параметар је типа птхреад_т. Креирана нит ће увек бити доступна са овом референцом.
  • Тхе аттр параметар вам омогућава да одредите прилагођено понашање. Можете користити низ функција специфичних за нит почевши од птхреад_аттр_ да бисте подесили ову вредност. Могућа прилагођавања су политика планирања, величина стека и политика одвајања.
  • старт_роутине специфицира функцију коју ће нит покренути.
  • арг представља генеричку структуру података коју нит прослеђује функцији.

Ево примера апликације:

#укључити
#укључити
#укључити
#укључити

празнина *радник(празнина *подаци)
{
цхар *име = (цхар*)подаци;

за (инт и = 0; и < 120; и++)
{
спавати (50000);
принтф("Здраво из тхреад наме = %с\н", име);
}

принтф(„Тет %с готов!\н“, име);
повратакНУЛА;
}

интглавни(празнина)
{
птхреад_т тх1, тх2;
птхреад_цреате(&тх1, НУЛА, радник, "Кс");
птхреад_цреате(&тх2, НУЛА, радник, "И");
спавати (5);
принтф("Излазак из главног програма\н");
повратак0;
}

Тхреад Типес

Када се нит врати из главни() функција у апликацији, све нити се прекидају и систем ослобађа све ресурсе које је програм користио. Исто тако, када изађете из било које нити са командом као што је ан излаз(), ваш програм ће прекинути све нити.

Са птхреад_јоин функцију, можете сачекати да се нит заврши. Нит која користи ову функцију ће се блокирати све док се очекивана нит не заврши. Ресурси које користе из система се не враћају чак ни у случајевима као што је прекид придружених нити, непланирани од стране ЦПУ-а или чак неуспех да се придруже са птреад_јоин.

Понекад постоје ситуације у којима спајање са птхреад_јоин нема смисла; ако је немогуће предвидети када ће се нит завршити, на пример. У овом случају, можете осигурати да систем аутоматски враћа све ресурсе на месту где се нит враћа.

Да бисте то постигли, требали бисте започети релевантне нити са ОДВОЈЕН статус. Приликом покретања нити, ОДВОЈИТИ статус се може подесити преко вредности атрибута нити или помоћу птхреад_детацх функција:

интптхреад_аттр_сетдетацхстате(&аттр, ПТХРЕАД_ЦРЕАТЕ_ДЕТАЦХЕД);
интптхреад_детацх(птхреад_т нит);

Ево примера употребе птхреад_јоин(). Замените главну функцију у првом програму са следећим:

интглавни(празнина)
{
птхреад_т тх1, тх2;
птхреад_цреате(&тх1, НУЛА, радник, "Кс");
птхреад_цреате(&тх2, НУЛА, радник, "И");
спавати (5);
принтф("излазак из главног програма\н");
птхреад_јоин (тх1, НУЛА);
птхреад_јоин (тх2, НУЛА);
повратак0;
}

Када компајлирате и покренете програм, ваш излаз ће бити:

Здраво из теме И
Здраво из теме Кс
Здраво из теме И
...
Здраво из теме И
излазак из главног програма
Здраво из теме Кс
...
Здраво из теме Кс
Нит Кс готов!
Здраво из теме И
Нит И готов!

Завршетак нити

Можете да откажете нит позивом птхреад_цанцел, проследивши одговарајући птхреад_т ид:

интптхреад_цанцел(птхреад_т нит);

Ово можете видети на делу у следећем коду. Опет, само главни функција је другачија:

интглавни(празнина)
{
птхреад_т тх1, тх2;
птхреад_цреате(&тх1, НУЛА, радник, "Кс");
птхреад_цреате(&тх2, НУЛА, радник, "И");
спавати (1);
принтф("> Отказивање нити И!!\н");
птхреад_цанцел (тх2);
спавати (100000);
принтф("> Отказивање нити Кс!\н");
птхреад_цанцел (тх1);
принтф("излазак из главног програма\н");
повратак0;
}

Зашто се креирају нити?

Оперативни системи увек покушавају да покрећу нити на једном или више ЦПУ-а, било са листе која је сама креирала или са листе нити коју је креирао корисник. Неке нити не могу да раде јер чекају на улазни/излазни сигнал од хардвера. Такође могу да чекају добровољно, чекају одговор од друге нити или да их друга нит блокира.

Можете да прилагодите ресурсе које додељујете нитима које креирате помоћу птхреад-а. Ово може бити прилагођена политика планирања или можете одабрати алгоритме за заказивање као што су ФИФО или Роунд-робин ако желите.