2017-01-25 119 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