编写适用于 Oracle® Solaris 11.2 的设备驱动程序

退出打印视图

更新时间: 2014 年 9 月
 
 

互斥锁

互斥锁 (mutex) 通常与一组数据关联,并控制对这些数据的访问。互斥锁提供了一种一次仅允许一个线程访问这些数据的方法。互斥锁函数包括:

mutex_destroy(9F)

释放任何关联的存储空间。

mutex_enter(9F)

获取互斥锁。

mutex_exit(9F)

释放互斥锁。

mutex_init(9F)

初始化互斥锁。

mutex_owned(9F)

测试以确定当前线程是否持有互斥锁。仅限于在 ASSERT(9F) 中使用。

mutex_tryenter(9F)

获取互斥锁(如果可用),但不阻塞。

设置互斥锁

设备驱动程序通常会为每个驱动程序数据结构分配一个互斥锁。互斥锁通常是该结构中类型为 kmutex_t 的字段。调用 mutex_init(9F) 以初始化要使用的互斥锁。通常在执行 attach(9E) 时为每个设备互斥锁进行此调用,在执行 _init(9E) 时为全局驱动程序互斥锁进行此调用。

例如,

struct xxstate *xsp;
/* ... */
mutex_init(&xsp->mu, NULL, MUTEX_DRIVER, NULL);
/* ... */

有关互斥锁初始化的较完整示例,请参见Chapter 6, Driver Autoconfiguration

驱动程序在卸载之前必须使用 mutex_destroy(9F) 销毁互斥锁。通常在执行 detach(9E) 时为每个设备互斥锁进行销毁操作,在执行 _fini(9E) 时为全局驱动程序互斥锁进行销毁操作。

使用互斥锁

驱动程序如果需要读写共享数据结构,必须执行以下操作:

  • 获取互斥锁

  • 访问数据

  • 释放互斥锁

互斥锁的作用域(即互斥锁保护的数据)完全由程序员决定。仅当访问数据结构的每个代码路径都保护数据结构并且同时持有互斥锁时,互斥锁才会保护该数据结构。