估计是学信号量已经过去很久了,很多同学已经忘记了如何用信号量解决实现进程同步了。但鲜有人去复习下信号量(至少在上实验课的时候,没看到有同学去复习),大多数人着急中网上找有没有现成的答案。

image-20220518213702460

作业批阅完了,主要有如下问题。

(1)抱怨时间不够

也许不是时间不够,而是你开始得太晚了。

上实验课,服务器卡,你们无法编程,是我的问题。我也紧急更换服务器,也提醒大家可以先在本地写(实际的情况是,极少有人动手做,服务器卡了,双手一摊),周二你们只有体育课,应该还是有不少时间的。

(2)文档可读性差

对于你们很多人来说,被我强行要求使用markdown,如果你没有很强的抵触情绪,应该能感受到markdown写计算机相关文档比word的优势了吧。

文档可读性差,体现在:

  • 代码不放到代码块里
  • 代码不进行格式化的,以下图为例,可读性几何?

image-20220518214711327

(3)使用sleep

sleep让父进程进入睡眠状态,在咱们系统里,的确能输出正确的结果。深入进去,你会发现,用sleep并不能保证子进程先运行,这依赖于调度。

(4)信号量初值为1

信号量初值为1,这样父子进程哪怕进行P操作,也都不会阻塞。也有人上来直接加个锁,让信号量减1,那么,直接初始化为0,不是更好吗。

(5)加锁和解锁次数不匹配

如下面代码,父子进程都会执行V(sem_id)释放锁,咱们说过,信号量实际上是一个整型,表示资源的数目,释放锁,相当于释放资源。

if (pid == 0) {
    // child
} else {
    // parent
}

V(sem_id)

(5)做成了互斥

如下面代码,如果信号量初值为1,那么就是很典型的进程互斥。如果信号量初值为0,并不能保证子进程先运行。

if (pid == 0) {
    // child
    P
    // do something
    V
} else {
    // parent
    P
    // do something
    V
}

写在最后

遇到一个问题不要慌,先把原理想清楚,然后再动手写代码。从软件工程角度来说,软件实现都还是在需求分析、软件设计后面呢。

本文系Spark & Shine原创,转载需注明出处本文最近一次修改时间 2022-05-18 22:03

results matching ""

    No results matching ""