如果锁确保一次只有一个线程访问锁定的数据,那么什么控制对锁定功能的访问?
我认为boost::mutex::scoped_lock应该在我的每个函数的开头,这样局部变量就不会被另一个线程意外修改,对吗?如果两个线程试图在非常接近的时间获取锁怎么办?内部使用的锁的局部变量不会被其他线程破坏吗?
我的问题不是特定于提升的,但除非您推荐另一个,否则我可能会使用它。
如果锁确保一次只有一个线程访问锁定的数据,那么什么控制对锁定功能的访问?
我认为boost::mutex::scoped_lock应该在我的每个函数的开头,这样局部变量就不会被另一个线程意外修改,对吗?如果两个线程试图在非常接近的时间获取锁怎么办?内部使用的锁的局部变量不会被其他线程破坏吗?
我的问题不是特定于提升的,但除非您推荐另一个,否则我可能会使用它。
您只需拥有对共享数据的独占访问权限。除非它们是静态的或在堆上,否则函数内部的局部变量对于不同的线程会有不同的实例,无需担心。但是共享数据(例如通过指针访问的东西)应该首先被锁定。
至于锁是如何工作的,它们经过精心设计以防止竞争条件,并且通常具有硬件级别的支持以保证原子性。IE,有一些机器语言结构保证是原子的。信号量(和互斥量)可以通过这些来实现。
没错,在实现锁时,您需要某种方式来保证两个进程不会同时获得锁。要做到这一点,您需要使用原子指令——它可以保证在不中断的情况下完成。一个这样的指令是test-and-set,该操作将获取布尔变量的状态,将其设置为 true,并返回先前检索到的状态。
这样做的目的是让您可以编写不断测试的代码,以查看它是否可以获得锁。假设 x 是线程之间的共享变量:
while(testandset(x));
// ...
// critical section
// this code can only be executed by once thread at a time
// ...
x = 0; // set x to 0, allow another process into critical section
由于其他线程不断地测试锁,直到它们进入临界区,这是保证互斥的一种非常低效的方法。但是,使用这个简单的概念,您可以构建更复杂的控制结构,例如更高效的信号量(因为进程没有循环,它们正在休眠)
最简单的解释是,锁在下面,是基于保证是原子的并且不会在线程之间发生冲突的硬件指令。
函数中的普通局部变量已经特定于单个线程。只有静态、全局或其他可以被多个线程同时访问的数据需要锁来保护它。
操作锁的机制控制对它的访问。
任何锁定原语都需要能够在处理器之间传达更改,因此它通常在总线操作之上实现,即读取和写入内存。它还需要被结构化,以便两个试图声明它的线程不会破坏它的状态。这并不容易,但您通常可以相信任何操作系统实现的锁都不会被多个线程破坏。