当前位置:  开发笔记 > 编程语言 > 正文

为什么锁有效?

如何解决《为什么锁有效?》经验,为你挑选了2个好方法。

如果锁确保一次只有一个线程访问锁定的数据,那么什么控制对锁定函数的访问?

我认为boost :: mutex :: scoped_lock应该在我的每个函数的开头,所以局部变量不会被另一个线程意外修改,这是正确的吗?如果两个线程试图在非常接近的时间获取锁定怎么办?内部使用的锁的局部变量不会被另一个线程损坏吗?

我的问题不是特定于提升,但我可能会使用它,除非你推荐另一个.



1> Sydius..:

您只需拥有对共享数据的独占访问权限.除非它们是静态的或在堆上,否则函数内的局部变量将针对不同的线程具有不同的实例,并且无需担心.但应首先锁定共享数据(例如通过指针访问的内容).

至于锁是如何工作的,它们经过精心设计以防止竞争条件,并且通常具有硬件级支持以保证原子性.IE,有一些机器语言结构保证是原子的.信号量(和互斥量)可以通过这些来实现.



2> Kyle Cronin..:

你是对的,在实现锁时你需要一些方法来保证两个进程不会同时获得锁.要做到这一点,你需要使用一个原子指令 - 一个保证完成而不会中断的指令.一个这样的指令是测试和设置,这个操作将获得布尔变量的状态,将其设置为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

由于其他线程不断测试锁,直到它们进入临界区,这是一种保证互斥的非常低效的方法.但是,使用这个简单的概念,您可以构建更复杂的控制结构,如信号量更高效(因为进程不循环,它们正在休眠)

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有