假設有5個線程等待信號多個線程等待同一個信號
CreateSemaphore(sem_bridgempty,0,1,INFINITE);
WaitForSingleObject(sem_bridgempty, INFINITE);
現在,當sem_bridgeempty發出信號,在5個線程的人會醒來,其餘的將再次等待sem_bridgeempty
進行通知。我在這裏嗎?
我實現一個車道橋樑問題,其中可能存在的車輛只能在time.Also從一個方向移動的橋的容量是固定在5.什麼到目前爲止,我所做的是
unsigned WINAPI enter(void *param)
{
int direction = *((int *)param);
while (1)
{
WaitForSingleObject(sem_bridgecount, INFINITE);
WaitForSingleObject(mut_mutex, INFINITE);
if (curr_direction == -1 || direction == curr_direction)
{
curr_direction = direction;
cars_count++;
std::cout << "Car with direction " << direction << " entered " << GetCurrentThreadId() << std::endl;
ReleaseMutex(mut_mutex);
break;
}
else
{
ReleaseMutex(mut_mutex);
WaitForSingleObject(sem_bridgempty, INFINITE);
}
}
Sleep(5000);
exit1(NULL);
return 0;
}
unsigned WINAPI exit1(void *param)
{
WaitForSingleObject(mut_mutex, INFINITE);
cars_count--;
std::cout << "A Car exited " << GetCurrentThreadId() << std::endl;
ReleaseSemaphore(sem_bridgecount, 1, NULL);
if (cars_count == 0)
{
curr_direction = -1;
std::cout << "Bridge is empty " << GetCurrentThreadId() << std::endl;
ReleaseSemaphore(sem_bridgempty, 1, NULL);
}
ReleaseMutex(mut_mutex);
return 0;
}
int main()
{
sem_bridgecount = CreateSemaphore(NULL, 5, 5, NULL);
sem_bridgempty = CreateSemaphore(NULL, 0, 1, NULL);
mut_mutex = CreateMutex(NULL, false, NULL);
//create threads here
}
考慮下面的部分
else
{
ReleaseMutex(mut_mutex);
WaitForSingleObject(sem_bridgempty, INFINITE);
一輛車方向1.Now將會有三個輸入與方向2.所有3將在WaitForSingleObject(sem_bridgempty, INFINITE);
。現在被封鎖請求時,橋去的三empty.One會拿起來。拿起一個將再次使b即使方向相同,另外兩個仍然會等待橋樑變空。 所以即使橋上有direction=2
汽車,其他方向相同的汽車仍在等待sem_bridgempty
。 我甚至(在exit1()
當cars_count=0
和resetevent()
在enter()
SetEvent的()當第一輛車進入)認爲使用sem_bridgempty
作爲一個事件,而不是semaphore
的。但仍然是所有線程不會醒來。
有什麼特別的理由,你爲什麼不使用['的std :: condition_variable'(http://en.cppreference.com/ W/CPP /線程/ condition_variable)? – user0042
沒有特別的原因。但是我必須使用windows同步函數來做這件事,所以我想我可以嘗試'sleepconditionvariablecs()',但是我也必須使用'EnterCriticalSection()'。也可以使用信號量和互斥量來完成?即使我必須使用別的東西,我也對這裏最好的方法感興趣。 – user3819404
問題在選擇的解決方案邏輯。你怎麼看它不是最好的。嘗試[此代碼](https://stackoverflow.com/a/45133951/6401656) – RbMm