如果锁确保一次只有一个线程访问锁定的数据,那么什么控制对锁定函数的访问?
我认为boost :: mutex :: scoped_lock应该在我的每个函数的开头,所以局部变量不会被另一个线程意外修改,这是正确的吗?如果两个线程试图在非常接近的时间获取锁定怎么办?内部使用的锁的局部变量不会被另一个线程损坏吗?
我的问题不是特定于提升,但我可能会使用它,除非你推荐另一个.
您只需拥有对共享数据的独占访问权限.除非它们是静态的或在堆上,否则函数内的局部变量将针对不同的线程具有不同的实例,并且无需担心.但应首先锁定共享数据(例如通过指针访问的内容).
至于锁是如何工作的,它们经过精心设计以防止竞争条件,并且通常具有硬件级支持以保证原子性.IE,有一些机器语言结构保证是原子的.信号量(和互斥量)可以通过这些来实现.
你是对的,在实现锁时你需要一些方法来保证两个进程不会同时获得锁.要做到这一点,你需要使用一个原子指令 - 一个保证完成而不会中断的指令.一个这样的指令是测试和设置,这个操作将获得布尔变量的状态,将其设置为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
由于其他线程不断测试锁,直到它们进入临界区,这是一种保证互斥的非常低效的方法.但是,使用这个简单的概念,您可以构建更复杂的控制结构,如信号量更高效(因为进程不循环,它们正在休眠)