[여기에 사용 된 용어는 POSIX 스레드와 관련이있을 수 있습니다]
이 문제를 해결하기 위해 FIFO 뮤텍스를 사용할 수 있어야합니다.
사용처 :
두 개의 스레드 T1과 T2가 임계 섹션을 실행하려고한다고 가정하십시오. 둘 다이 중요한 부분을 벗어나서 많은 시간을 할애 할 필요가 없습니다. 따라서, T1은 잠금, 실행 및 잠금 해제 및 웨이크 업을 위해 T2에 신호를 보낼 수있다. 그러나 T2가 깨어나 잠금을 획득하기 전에 T1은 잠금을 다시 획득하고 실행합니다. 이런 식으로, T2가 실제로 잠금을 획득하기 전에 아주 오래 기다려야 할 수도 있습니다.
작동 방식 / 구현 방법 :
뮤텍스를 잠그십시오. 각 스레드의 스레드 특정 데이터 (TSD)를 스레드 ID 및 세마포어를 포함하는 노드로 초기화하십시오. 또한 소유 (TRUE 또는 FALSE 또는 -1), 소유자 (소유자 스레드 ID)의 두 변수가 있습니다. 또한 웨이터 큐의 마지막 노드를 가리키는 웨이터 큐 및 포인터 waiterLast를 유지하십시오.
잠금 조작 :
node = get_thread_specific_data(node_key);
lock(mutex);
if(!owned)
{
owned = true;
owner = self;
return success;
}
node->next = nullptr;
if(waiters_queue == null) waiters_queue = node;
else waiters_last->next = node;
waiters_last = node;
unlock(mutex);
sem_wait(node->semaphore);
lock(mutex);
if(owned != -1) abort();
owned = true;
owner = self;
waiters_queue = waiters_queue->next;
unlock(mutex);
잠금 해제 조작 :
lock(mutex);
owner = null;
if(waiters_queue == null)
{
owned = false;
return success;
}
owned = -1;
sem_post(waiters_queue->semaphore);
unlock(mutex);