两个信号量、两个函数和一个函数只允许同时工作



我有以下练习:

给定的程序片段包含两个函数 mywrite() 和 myread(),它们位于同一个写入文件或从文件中读取。这些 许多一次又一次调用的线程使用两个函数。它 应确保同时只能读取或可以 写。一次只允许一个书写线程。倍数 允许同时读取线程。完成给定的 仅使用给定的解决方案二进制信号量的程序 S 和 T 以及整数变量 c。您的解决方案不必是 公平是。对于信号量的初始化,您可以例如使用 S:=0,这意味着信号灯繁忙。使用函数 讲座中介绍:S.acquire() 或 S.release()。

以及以下解决方案:

Semaphor S := 1;
Semaphor T := 1;
int c = 0;
void mywrite()
{
T.acquire();
write_data_to_file();
T.release();
}
void myread()
{
S.acquire();
if (c == 0)
{
T.acquire()
}
c++;
S.release();
read_data_from_file();
S.acquire();
c--;
if (c == 0)
{
T.release()
}
S.release();
}

我不知道,为什么 T.acquire() 在 myread() 函数中排在 S.acquire() 之后。 计数器递增,但为什么呢?mywrite() 函数从不检查 c 的值。

S提供对c的互斥访问。


每个作家获取和发布T.

当没有其他活动读取器时,读取器也会获取T。当没有更多的活跃读者时,它会发布。

这可确保:

  • 当有活跃的作家时,准作家会等待。
  • 当有活跃的作家时,潜在的读者会等待。
  • 当有一个或多个活跃读者时,潜在的作家会等待。

c是活跃读者的数量。读取器使用c来确定是否有其他活动读取器。换句话说,读取器使用c来确定它是否需要获取T,以及它是否应该释放T

您不能让多个线程同时访问c,因此需要围绕c访问进行某种形式的互斥。S用于提供该功能。S不是在获取T之前获取的,而是在访问c之前获取S

最新更新