我有以下练习:
给定的程序片段包含两个函数 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
。