Linux下的线程同步与互斥

来源:互联网 发布:pc端电视直播软件 编辑:程序博客网 时间:2024/05/15 11:09

Linux下线程同步方式:互斥锁、信号量、条件变量
一:线程
1.两个线程进行切换的时机

  当进程从内核态返回用户态的时候,操作系统会自动检测是否要进行线程切换。   root在操作系统态时拥有最高权限,但是不能让root去运行用户代码,操作系统认为用户代码是不安全的。   在调用接口时,因为接口是操作系统提供的,所以就要切换用户态为内核态方可调用接口。(权限必须切换到内核态)。

二:访问临界资源
在访问临界资源时,一定要保证访问临界资源的原子性。
保证共享资源数据操作的完整性,任何时间只能有一个线程访问临界资源。
互斥锁(mutex):完成互斥功能
  锁机制是同一时刻只允许一个线程执行一个关键部分的代码。
线程必须先获得互斥锁才能访问临界资源,访问该临界资源后释放该锁,如果无法获得锁线程就会一直等待直到获得锁为止。
互斥锁的使用:
创建—加锁—解锁 要明白什么时候加锁,什么时候解锁。
互斥锁也是一种临界资源,所以加锁和解锁也是原子的(既然互斥锁是用来保护临界资源的原子性,在保护别人安全下一定要先保证自己是安全的)。
某种程度上来说互斥锁相当于二元信号量,只不过二元信号量是用于进程的,互斥锁是用于线程的。

1. 初始化锁  int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);   其中参数 mutexattr 用于指定锁的属性(见下),如果为NULL则使用缺省属性。   互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。当前有四个值可供选择:   (1)PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。   (2)PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。   (3)PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。   (4)PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。 2. 阻塞加锁  int pthread_mutex_lock(pthread_mutex *mutex); 3. 非阻塞加锁   int pthread_mutex_trylock( pthread_mutex_t *mutex);   该函数语义与 pthread_mutex_lock() 类似,不同的是在锁已经被占据时返回 EBUSY 而不是挂起等待。 4. 解锁(要求锁是lock状态,并且由加锁线程解锁)  int pthread_mutex_unlock(pthread_mutex *mutex); 5. 销毁锁(此时锁必需unlock状态,否则返回EBUSY)  int pthread_mutex_destroy(pthread_mutex *mutex);
原创粉丝点击