Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PSRCh_studentam / ПСРЧ Лаб робота 1.doc
Скачиваний:
45
Добавлен:
23.03.2015
Размер:
1.9 Mб
Скачать

2.4. Засоби синхронізації потоків

QNX-6 забезпечує POSIX-засоби синхронізації потоків, деякі з них можуть бути застосовні між потоками в різних процесах. Служби синхронізації вміщують наступне:

  • м'ютекси,

  • умовні змінні,

  • бар'єри,

  • sleepon-блокування,

  • блокування читання/запису,

  • семафори,

  • FIFO-планування,

  • передача/прийом/відповідь,

  • атомарні операції.

Взаємно-виключні блокування, чи м'ютекси, є найбільш простими засобами синхронізації. М'ютекс використовується, щоб гарантувати монопольний доступ до загальнодоступних між потоками даних. Тільки один потік може блокувати м'ютекс у будь-який даний час. Потоки, що намагаються блокувати вже блокований м'ютекс, блокуються. Коли потік розблокує м'ютекс, потік з вищим пріоритетом, що очікує м'ютекс, розблокується і стане новим власником м'ютексу. Таким чином, потоки будуть послідовно захоплювати м'ютекс через критичний інтервал часу в порядку пріоритетної черги.

Умовна змінна, чи condvar, використовується, щоб блокувати потік у межах критичної секції програмного коду, доки певна умова не буде задоволена. Умова може бути довільною.

Бар'єр – це механізм синхронізації, що дозволяє призупинити декілька потоків, змушуючи їх чекати у визначеній точці (біля "бар'єру"), доки таких потоків не набереться певне число. Коли зазначене число таких потоків, що чекають у бар'єра, набралося, вони усі розблокуються і можуть продовжувати далі своє виконання.

Sleepon-блокування схожі на condvar, з декількома розходженнями. Подібно condvar, sleepon блокування може використовуватися, щоб блокувати потік, доки певна умова не буде задовільнена. На відміну від condvar, sleepon-блокування мають "захований" м'ютекс, який програмно не доступний, і тому їх використання більш просте й надійне.

Блокування читання/запису використовуються для розв'язку проблеми "читач/письменник". Коли певний потік намагається записати дані до загальної області пам'яті, то за допомогою використання блокувань читання/запису його запит може бути відхилений, доки потік, що читає ці дані не розблокує її. Аналогічні дії можна виконати і при спробі читання під час запису даних іншим потоком.

Семафори аналогічні м'ютексам з тим розходженням, що доступ до ресурсу має не один потік, а кілька. Звільнення ресурсу збільшує семафор на одиницю, а захоплення – зменшує на одиницю. Якщо потік очікує на семафорі, що є позитивним, він не будете блокований. Чекання на не позитивному семафорі блокує, поки деякий інший потік не збільшує його. Семафори були визначені, щоб синхронізувати процеси. Для синхронізації між потоками в окремому процесі, м'ютекс буде більш ефективний, ніж семафори.

FIFO-алгоритм може гарантувати, що ніякі два потоки того ж самого пріоритету не виконають критичну секцію водночас. Усі FIFO-потоки в системі одного пріоритету будуть виконуватися по черзі, доки вони добровільно не звільнять процесор.

Передачі повідомлень Send/Receive/Reply здійснюють неявну синхронізацію за характером блокування. Це єдина синхронізація, що може використовуватися в мережі.

У деяких випадках необхідно виконати коротку операцію з гарантією, що операція не буде вивантажуватися іншим потоком чи програмою обробки переривання. Neutrino забезпечує атомарні операції для додавання значення, віднімання значення, очищення бітів, встановлення бітів.

Соседние файлы в папке PSRCh_studentam