代码之家  ›  专栏  ›  技术社区  ›  Tim Matthews

为什么锁能用?

  •  4
  • Tim Matthews  · 技术社区  · 17 年前

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

    boost::mutex::scoped_lock 应该在每个函数的开头,这样本地变量就不会被另一个线程意外修改,对吗?如果两个线程试图在非常接近的时间获取锁,会怎么样?内部使用的锁的局部变量不会被另一个线程损坏吗?

    我的问题不是针对boost的,但我可能会使用它,除非你推荐另一个。

    4 回复  |  直到 17 年前
        1
  •  10
  •   Sydius    17 年前

    您只需要以独占方式访问共享数据。除非它们是静态的或在堆上,否则函数中的局部变量对于不同的线程将有不同的实例,不必担心。但共享数据(例如,通过指针访问的内容)应该首先锁定。

        2
  •  10
  •   Kyle Cronin    17 年前

    没错,在实现锁时,需要某种方法来保证两个进程不会同时获得锁。要做到这一点,你需要使用一个原子指令——一个保证无中断完成的指令。一个这样的指示是 test-and-set

    这样做的目的是允许您编写代码,不断测试它是否能够获得锁。假设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
    

        3
  •  4
  •   Larry Gritz    17 年前

    函数中的普通局部变量已经特定于单个线程。只有静态数据、全局数据或其他数据可以由多个线程同时访问,并且需要有锁来保护它们。

        4
  •  0
  •   Tim Cooper    14 年前

    操作锁的机构控制对锁的访问。

    任何锁定原语都需要能够在处理器之间传递更改,因此它通常在总线操作之上实现,即读写内存。它的结构还需要确保两个试图声明它的线程不会破坏它的状态。这并不容易,但您通常可以相信,任何操作系统实现的锁都不会被多个线程损坏。