2017-01-25 158 views
0

我有2個進程同步的問題。我有3個X進程和5個Y進程。我也有2個資源 - A和B.相互排斥和進程同步; C++

資源'A'可以被最多3個進程同時使用,並且通過訪問資源'B'互斥是必要的。

進程X和Y:

void processX() 
{ 
    while (1) 
    { 
     AccessToResource(B); 

     AccessToResource(A); 
    } 
} 

void processY() 
{ 
    while (1) 
    { 
     AccessToResource(A); 

     AccessToResource(B); 
    } 
} 

我怎樣才能做到這一點使用信號量,互斥事件,最近的路?

現在我有

CSemaphore sem(1,5,L"semaph"); 

之前和訪問資源後使用它通過sem.Lock()和sem.Unlock(),但它不太好。

+0

因此,您不需要同時鎖定A和B的訪問權限?對每個資源的訪問可以與另一個分開處理? –

+0

進程X和Y正在同時運行。我不知道如何處理它,這是我的第一個任務,它具有類似於 – Pawel

+0

@Pawel C++標準沒有過程的概念,標準庫沒有過程間通信API。您需要指定您打算在問題中使用的API。 – user2079303

回答

2

Resource'A」可以通過最大可使用3個proceses

計數信號將是合適的這裏(見wiki)。它的工作原理如下:

你有一些計數器(因此名稱)用0初始化。每當某個進程擁有資源A時,它將信號量增加1。如果計數在你的情況下達到3就意味着已經存在3個使用資源「A」的進程。在使用資源「A」完成處理後,它將該計數器(semafore)減1,從而允許其他進程使用該資源。

通過訪問資源 'B' 相互排除是必要

在這裏的合適的解決方案是一個mutex(或二進制信號量)。他們都工作幾乎相同 - 差異mutex重點欠資源

+0

'std :: mutex'如果OP實際使用*進程*而不是線程將無濟於事。儘管這是一個實現細節,但我們並不知道OP是否需要實現特定的答案或通用答案(您提供的答案)。 –

+0

@Someprogrammerdude是的,對不起,我只是被C++標籤誤導。修復了答案。 –

+0

@Yuriy Ivaskevych通用答案是可以的,以便具體實現。我認爲這個答案對我來說已經足夠了:)非常感謝 – Pawel