首页 > 试题广场 >

以下哪些线程同步锁可以为递归锁

[单选题]
以下哪些线程同步锁可以为递归锁
1.信号量  2.读写锁   3.互斥量   4.事件   5.临界区(Critical Section)
  • 1,3,4,5
  • 5
  • 3,5
  • 1,3,5
推荐
C
进程/线程同步方法

常见的进程/线程同步方法有互斥锁(或称互斥量Mutex)、读写锁(rdlock)、条件变量(cond)、信号量(Semophore)等。

在windows系统中,临界区(Critical Section)和事件对象(Event)也是常用的同步方法。

递归锁/非递归锁

Mutex可以分为递归锁(recursive mutex)和非递归锁(non-recursive mutex)。 递归锁也叫可重入锁(reentrant mutex),非递归锁也叫不可重入锁(non-reentrant mutex)。

二者唯一的区别是:

同一个线程可以多次获取同一个递归锁,不会产生死锁。

如果一个线程多次获取同一个非递归锁,则会产生死锁。

Windows下的Mutex和Critical Section是可递归的。

Linux下的pthread_mutex_t锁是默认是非递归的可以通过设置PTHREAD_MUTEX_RECURSIVE属性,将pthread_mutex_t锁设置为递归锁。

编辑于 2015-01-30 16:20:16 回复(0)

互斥锁( mutexlock ):

最常使用于线程同步的锁;标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁;临界区和互斥量都可用来实现此锁,通常情况下锁操作失败会将该线程睡眠等待锁释放时被唤醒

自旋锁(spinlock):

同样用来标记只能有一个线程访问该对象,在同一线程多次加锁操作会造成死锁使用硬件提供的swap指令或test_and_set指令实现;同互斥锁不同的是在锁操作需要等待的时候并不是睡眠等待唤醒,而是循环检测保持者已经释放了锁,这样做的好处是节省了线程从睡眠状态到唤醒之间内核会产生的消耗,在加锁时间短暂的环境下这点会提高很大效率

读写锁(rwlock):

高级别锁,区分读和写,符合条件时允许多个线程访问对象。处于读锁操作时可以允许其他线程和本线程的读锁, 但不允许写锁, 处于写锁时则任何锁操作都会睡眠等待;常见的操作系统会在写锁等待时屏蔽后续的读锁操作以防写锁被无限孤立而等待,在操作系统不支持情况下可以用引用计数加写优先等待来用互斥锁实现。 读写锁适用于大量读少量写的环境,但由于其特殊的逻辑使得其效率相对普通的互斥锁和自旋锁要慢一个数量级;值得注意的一点是按POSIX标准 在线程申请读锁并未释放前本线程申请写锁是成功的,但运行后的逻辑结果是无法预测

递归锁(recursivelock):

严格上讲递归锁只是互斥锁的一个特例,同样只能有一个线程访问该对象,但允许同一个线程在未释放其拥有的锁时反复对该锁进行加锁操作; windows下的临界区默认是支持递归锁的,而linux下的互斥量则需要设置参数PTHREAD_MUTEX_RECURSIVE_NP,默认则是不支持

编辑于 2016-07-20 21:07:11 回复(0)
答案:B
严格上讲递归锁只是互斥锁的一个特例,同样只能有一个线程访问该对象,但允许同一个线程在未释放其拥有的锁时反复对该锁进行加锁操作; windows下的临界区默认是支持递归锁的,而linux下的互斥量则需要设置参数PTHREAD_MUTEX_RECURSIVE_NP,默认则是不支持。
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 
3、信号量:为控制一个具有有限数量用户资源而设计。 
4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。
临界区只能用于对象在同一进程里线程间的互斥访问;互斥体可以用于对象进程间或线程间的互斥访问。
发表于 2015-01-29 17:42:41 回复(1)
C
进程/线程同步方法

常见的进程/线程同步方法有互斥锁(或称互斥量Mutex)、读写锁(rdlock)、条件变量(cond)、信号量(Semophore)等。

在windows系统中,临界区(Critical Section)和事件对象(Event)也是常用的同步方法。

发表于 2017-04-20 15:53:25 回复(0)
临界区属于线程同步锁?不是一段程序片段吗?应该是用互斥锁或者信号量之类的来保证对临界区的执行是互斥的吧。总觉得这题描述很奇怪。
发表于 2016-10-20 17:19:59 回复(0)
C++11 标准中<mutex> 里面的锁,包含了递归锁和非递归锁
发表于 2017-10-07 10:01:43 回复(0)
进程/线程同步方法

常见的进程/线程同步方法有互斥锁(或称互斥量Mutex)、读写锁(rdlock)、条件变量(cond)、信号量(Semophore)等。 

在windows系统中,临界区(Critical Section)和事件对象(Event)也是常用的同步方法。 

递归锁/非递归锁

Mutex可以分为递归锁(recursive mutex)和非递归锁(non-recursive mutex)。 递归锁也叫可重入锁(reentrant mutex),非递归锁也叫不可重入锁(non-reentrant mutex)。 

二者唯一的区别是: 

同一个线程可以多次获取同一个递归锁,不会产生死锁。 

如果一个线程多次获取同一个非递归锁,则会产生死锁。 

发表于 2015-08-07 16:26:25 回复(0)
yst头像 yst
互斥量和信号量可以作为进程同步的递归锁
发表于 2015-07-03 22:13:29 回复(0)
b
发表于 2015-01-20 17:35:01 回复(0)