我在读艾布拉姆的《操作系统原理》,加尔文。进程同步主题中,对TestAndSet函数给出了以下定义,该函数稍后用于确保互斥:
boolean TestAndSet(boolean *target) {
boolean rv = *target;
*target = TRUE;
return rv;
}
书中提到这个指令是一个特殊的硬件指令,它是原子执行的。
我的问题是如何在C语言中实现这一点?我需要像为其他用户定义函数那样提供它的定义吗?还是需要导入一些已经实现此功能的库?如果是前者,并且我自己定义了函数,那么它将以原子方式执行的保证是什么?
按原子论的说法,我的理解是它将作为一条指令执行,即,如果两个进程调用这个函数,那么被调用的函数将按顺序执行,并且它们的语句不会被交织(甚至在转换为机器语言之后也不会)。
请帮忙。我很难理解这本书的内容。
最佳答案
书中提到这个指令是一个特殊的硬件指令,它是原子执行的。我的问题是如何在C语言中实现这一点?
这本书提供了一个C函数,您介绍了它,它旨在解释行为。它已经做了一切,除了没有任何原子性的保证。
c211基本上以atomic_flag_test_and_set()
的形式提供了您所描述的、预先构建的内容。如果您可以假设c211是您的实现语言,那么您可以使用它。
但是,标准C的早期版本并没有提供实现这样一个函数所需的功能,而且事实上,即使c211也没有提供机制,使您能够在不依赖C的内置原子类型和函数的情况下实现自己的原子操作。
我需要像为其他用户定义函数那样提供它的定义吗?还是需要导入一些已经实现此功能的库?
所呈现的代码似乎是为了解释而不是函数。原子测试和集合的行为与该函数的行为相同,前提是可以保证该函数以原子方式运行。
如果是前者,并且我自己定义了函数,那么它将以原子方式执行的保证是什么?
没有。
按原子论的说法,我的理解是它将作为一条指令执行,即,如果两个进程调用这个函数,那么被调用的函数将按顺序执行,并且它们的语句不会被交织(甚至在转换为机器语言之后也不会)。
也许更具描述性的是,每一个可能的观察者都会看到原子操作开始之前的状态,或者在它完成之后的状态,而不是在中间某个地方的状态。
关于c - 流程同步-TestAndSetLock,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33245348/