Page 122 - 4868
P. 122

Ошибка! Стиль не определен.                                                              120

               щоб  планування  потоку  відбувалося  глобально,  а  не  локально,  тобто  щоб
               потік конкурував за процесор зі всіма потоками, а не тільки із батьківським
               потоком,  що  його  створив.  Виклик  функції  pthread_attr_setscope
               враховує  дану  необхідність.  Новий  потік  створюється  викликом  функції
               pthread_create:

                     pthread_create(&tid, &tattr, start_func, arg);

                     Перший аргумент – це адрес дескриптора потоку, що заповнюється при
               його успішному створенні. Другий представляє адрес дескриптора атрибутів
               потоку. Новий потік починає роботу з виклику функції start_func з єдиним
               аргументом        arg.     Якщо      потік     створений       успішно,       то    функція
               pthread_create повертає значення 0.
                     Для завершення роботи потіку необхідно викликати функцію:

                     pthread_exit(value);
                     Параметр  value  –  це  скалярне  значення  (або  NULL).  Процедура  exit

               викликається  неявно,  якщо  потік  повертає  керування  з  функції,  виконання
               якої він почав.

                     Батьківський  процес  може  очікувати  завершення  роботи  дочірнього
               процесу, викликаючи функцію:
                     pthread_join(tid, value_ptr);

                     Де  tid  –  дескриптор  дочірнього  процесу,  а  параметр  value_ptr  –
               адреса змінної в яку поміщаєть значення, що повертає потік під час виклику
               функції exit.


                     17.2. Керування потоками через семафори
                     Потоки  взаємодіють  між  собою  за  допомогою  змінних,  що
               оголошуються  глобальними  по  відношенню  до  функцій,  які  виконуються
               потоками.  Потоки  можуть  бути  синхронізовані  за  допомогою  активного
               очікування, блокувань, семафорів або умовних змінних.
                     Заголовочний  файл  semaphore.h  включає  в  себе  визначення  і

               прототипи  операцій  для  семафорів.  Дескриптори  семафорів  визначені  як
               глобальні по відношенню до потоків, які їх використовують, наприклад:

                     sem_t mutex;

                     Дескриптор        пороку      ініціюється      викликом       функції      sem_init.
               Наприклад, наступний виклик функції sem_init присвоює семафору mutex
               значення 1:

                     sem_init(&mutex, SHARED, 1);

                     Якщо  параметр  SHARED  не  дорівнює  нулю,  то  семафор  може  бути
               розподілений        між     декількома       процесами,       інакше      семафор      може
               використовувати  тільки  потоки  одного  процесу.  Еквівалент  операції  P  в
               бібліотеці  Pthreads  педставлений  функцією  sem_wait,  а  операція  V  –
               функцією  sem_post.  Отже,  один  із  способів  захисту  критичної  секції  за
   117   118   119   120   121   122   123   124   125   126   127