Създайте нишки с pthread_create, присъединете нишки с pthread_join, преминете

Създаване и изчакване на поток

Нека да видим прост пример

В този пример вътре в основната нишка, в която се изпълнява основната функция, се създава нова нишка, вътре в която се извиква функцията helloWorld. Функцията helloWorld показва поздрав. Поздрав се показва и в основната нишка. След това потоците се комбинират.

Създава се нова нишка с помощта на функцията pthread_create

Функцията получава като аргументи указател към нишка, променлива от типа pthread_t, в която, ако е успешна, записва идентификатора на нишката. pthread_attr_t - атрибути на нишки. Ако се използват атрибутите по подразбиране, тогава може да се предаде NULL. start_routin е директно функцията, която ще бъде изпълнена в новата нишка. arg са аргументите, които ще бъдат предадени на функцията.

Нишката може да прави много различни неща и да получава различни аргументи. За да направи това, функцията, която ще се изпълнява в нова нишка, приема аргумент от тип void *. Поради това можете да обгърнете всички предадени аргументи в структура. Можете също така да върнете стойност чрез предадения аргумент.

При успех функцията връща 0. Ако са възникнали грешки, могат да се върнат следните стойности

  • ИЗВЪН - системата няма ресурси за създаване на нова нишка или системата вече не може да създава нишки, тъй като броят на нишките е надвишил стойността на PTHREAD_THREADS_MAX (например на една от машините, които се използват за тестване, тази магия номер е 2019)
  • EINVAL - невалидни атрибути на потока (предадени от аргумента attr)
  • EPERM - Извикващата нишка няма подходящите права за задаване на необходимите параметри или правила за планиране.

Нека да преминем през програмата

Тук задаваме набора от стойности, необходими за обработка на възможни грешки.

Това е функция, която ще работи в отделна нишка. Тя няма да получи никакви аргументи. Според стандарта се счита, че изричен изход от функцията извиква функцията pthread_exit и връщаната стойност ще бъде предадена при извикване на функцията pthread_join като статус.