ка дійсно створює м'ютекс, а наступні - отримують дескриптор вже існуючого об'єкта. Це дає можливість декільком ниткам отримати дескриптор одного і того ж мьютекса, звільняючи програміста від необхідності піклуватися про те, хто насправді створює м'ютекс. Якщо використовується такий підхід, бажано встановити прапор bInitialOwner в FALSE, інакше виникнуть певні труднощі при визначенні дійсного творця мьютекса. Кілька ниток можуть отримати дескриптор одного і того ж мьютекса, що робить можливим взаємодія між процесами. Можна використовувати такі механізми такого підходу:
· Дочірній процес, створений за допомогою функції CreateProcess може успадковувати дескриптор мьютекса у разі, якщо при створенні мьютекса функцією CreateMutex був вказаний параметр lpMutexAttributes.
· Нитка може отримати дублікат існуючого мьютекса за допомогою функції DuplicateHandle.
· Нитка може вказати ім'я існуючого мьютекса при виклику функцій OpenMutex або CreateMutex.
Для того щоб оголосити взаємовиключає належить поточної нитки, треба викликати одну з чекаючих функцій. Нитка, якій належить об'єкт, може його «захоплювати» повторно скільки завгодно разів (це не призведе до самоблокировки), але стільки ж разів вона повинна буде його звільняти за допомогою функції ReleaseMutex.
Для синхронізації ниток одного процесу більш ефективно використання критичних секцій.
Приклад. Синхронізація ниток за допомогою м'ютексів.
# include
# include hMutex; a [5]; hThr; long uThrID; Thread (void * pParams)
{i, num=0; (1)
{(hMutex, INFINITE); (i=0; i <5; i + +) a [i]=num; + +; (hMutex);
}
} main (void)
{= CreateMutex (NULL, FALSE, NULL);=CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) Thread, NULL, 0, & uThrID); (1)
{(hMutex, INFINITE); («% d% d% d% d% d n», a [0], a [1], a [2], a [3 ], a [4]); (hMutex);
} 0;
}