我有2个进程同步的问题。我有3个X流程和5个Y流程。我也有2个资源-A和B。

资源“ 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()来使用它,但这不是很好。

最佳答案

资源“ A”最多可使用3个过程


在这里对信号量进行计数是合适的(请参见wiki)。它的作用如下:

您有一个用0初始化的计数器(即名称)。每当某个进程拥有资源A时,信号量就会增加1。如果在您的情况下count达到3,则意味着已经有3个进程在使用资源'A'。进程完成使用资源“ A”后,它将计数器(semafore)减1,从而允许其他进程使用该资源。


  通过访问资源“ B”,相互排除是必要的


此处合适的解决方案是mutex(或二进制信号量)。它们的工作原理几乎相同-区别在于mutex着重于欠缺资源。

09-26 11:42