在第一次上OS课之前,我只是第一次学习锁。我最初认为锁实际上是“锁定某些资源”,您需要在其中指定资源(也许通过指向内存中资源的地址的指针),但是在阅读了几个自旋锁的真正基本实现之后(例如,类Unix的培训操作系统“xv6”的版本):
http://pages.cs.wisc.edu/~skobov/cs537/P3/xv6/kernel/spinlock.h
http://pages.cs.wisc.edu/~skobov/cs537/P3/xv6/kernel/spinlock.c
以及之前的堆栈溢出问题:(What part of memory does a mutex lock? (pthreads))
我想我都错了。
相反,在我看来,锁实际上只是一个 bool 型标志,如变量,它临时(或无限期)地阻止某些将利用资源的代码的执行,但仅在另一个线程实际上也尝试获取该锁的位置(在第二个线程中的那个位置)尝试也获取该锁,则第二线程的阻塞具有该副作用,即该第二线程在第一线程释放该锁之前不能利用资源。因此,现在我想知道的是:如果一个设计不良的线程不使用互斥锁,而只是试图利用另一个设计良好的线程所锁定的资源,那么设计不良的线程是否能够访问该资源(无论如何,只要忽略该变量即可)。互斥锁-我现在正在考虑充当线程应查看的标志,但是有机会忽略它)?
如果是这样,那么为什么我们将锁实现为复杂的 bool 变量,以使所有线程都必须使用锁,而不是阻止访问内存区域的锁?
由于我对这一切还比较陌生,因此,如果我错误地陈述了我的问题以及答案,我将感谢任何合理的术语编辑建议!
非常感谢你!
--edit,谢谢大家的及时和有益的回复!
最佳答案
If that's the case, then why do we implement locks as sophisticated boolean variables such that all threads must use the locks as opposed to a lock that instead prevents access to a memory region?
原因很多:
等等。
关于c - 互斥锁是否仅在所有相关线程尝试在利用资源之前尝试获取其应获取的锁的情况下才能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62642917/