【问题标题】:Lock Holder Preemption锁持有人抢占
【发布时间】:2015-06-11 12:05:34
【问题描述】:

你能在并发程序中有以下场景吗?

假设一个线程获取一个锁来执行一个临界区。然后在临界区执行之前处理器抢占线程。执行的新线程需要来自旧线程(被抢占)的锁。所以当前线程无法继续(挂起直到它被抢占)。操作系统中是否有机制在释放锁之前不让线程抢占?

【问题讨论】:

  • 在linux spinlock中,当一个进程试图获取spinlock时,它首先禁用抢占。这样就不会发生各种死锁。对于阻塞锁(互斥锁),请参阅 Danel 的回答。

标签: multithreading


【解决方案1】:

在执行临界区时,持有互斥锁的线程可能会被抢占。如果操作系统切换到的线程试图获取该互斥体并发现它已经被锁定,那么该线程应该立即被上下文切换出去。线程调度程序应该足够聪明,在它切换回持有互斥锁的线程并释放互斥锁之前不会切换回该线程。

【讨论】:

  • 而当互斥锁被释放时,等待线程进入运行队列等待稍后执行。
【解决方案2】:

如果您正在编写内核代码,那么可以,有一些机制可以防止线程抢占。

对于标准代码,没有这样的东西。有些操作是原子的,编译器和内核会确保它们是原子的,但是在这些操作之后,线程可能会被抢占,并且它可以在不确定的时间内保持抢占(除非系统是实时系统)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-12
    • 2018-09-16
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    相关资源
    最近更新 更多