互斥和进程同步; C++
Mutual excluding and process synchronization; C++
我有 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() 使用它,但它不太好。
Resource'A' may be used by max 3 proceses
计数信号量在这里很合适(参见wiki)。它的工作原理如下:
您有一些初始化为 0 的计数器(因此得名)。每次某个进程拥有资源 A 时,它都会将该信号量增加 1。如果在您的情况下计数达到 3,则意味着已经有 3 个进程在使用资源'A'。进程使用完资源后 'A' 它将计数器 (semafore) 减 1,从而允许其他进程使用该资源。
by accessing to resource 'B' mutual excluding is necessary
这里一个合适的解决方案是mutex(或二进制信号量)。它们的工作原理几乎相同——区别在于 mutex
强调 欠资源 。
我有 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() 使用它,但它不太好。
Resource'A' may be used by max 3 proceses
计数信号量在这里很合适(参见wiki)。它的工作原理如下:
您有一些初始化为 0 的计数器(因此得名)。每次某个进程拥有资源 A 时,它都会将该信号量增加 1。如果在您的情况下计数达到 3,则意味着已经有 3 个进程在使用资源'A'。进程使用完资源后 'A' 它将计数器 (semafore) 减 1,从而允许其他进程使用该资源。
by accessing to resource 'B' mutual excluding is necessary
这里一个合适的解决方案是mutex(或二进制信号量)。它们的工作原理几乎相同——区别在于 mutex
强调 欠资源 。