Linux线程同步------互斥量
来源:互联网 发布:最真实的网络射击游戏 编辑:程序博客网 时间:2024/04/28 12:17
一、什么是互斥量
互斥量是另一种用于多线程中的同步访问方法,它允许程序锁住某个对象,使得每次只能有一个线程访问它。为了控制对关键代码的访问,必须在进入这段代码之前锁住一个互斥量,然后在完成操作之后解锁。
二、互斥量的函数的使用
它们的定义与使用信号量的函数非常相似,它们的定义如下:
#include <pthread.h> int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); int pthread_mutex_destroy(pthread_mutex_t *mutex);它们的意义就如它们的名字所示的那样,成功时返回0,失败时返回错误代码,它们并不设置errno。
pthread_mutex_init函数中的参数mutexattr指定互斥量的属性,在这里我们并不关心互斥量的属性,所以把它设置为NULL,使用默认属性即可。同样的,pthread_mutex_lock和pthread_mutex_unlock都是原子操作,如果一个线程调用pthread_mutex_lock试图锁住互斥量,而该互斥量,又被其他线程锁住(占用),则该线程的pthread_mutex_lock调用就会阻塞,直到其他线程对该互斥量进行解锁,该线程才能获得该互斥量,pthread_mutex_lock调用才会返回。
注意,使用互斥量的默认属性,如果程序试图对一个已经加锁的互斥量调用pthread_mutex_lock,程序就会阻塞,而又因为拥有互斥量的这个线程正是现在被阻塞的线程,所以这个互斥量就永远不会被解锁,也就是说,程序就会进入死锁的状态。在使用时要多加注意,确保在同一个线程中,对加锁的互斥再次进行加锁前要对其进行解锁。
举个例子:
如果你对两个个线程这样加锁:
void *thr_fn1(void *arg){ printf("thread1 before lock\n"); pthread_mutex_lock(&mutex_for_hid_move); printf("lock thread1\n");}void *thr_fn2(void *arg){ printf("thread2 before lock\n"); pthread_mutex_lock(&mutex_for_hid_move); printf("lock thread2\n"); }那么输出结果永远是某个线程阻塞在那里,结果如下:
root@ubuntu:/test/linux/20160218# gcc -lpthread mutex.c root@ubuntu:/test/linux/20160218# ./a.out thread2 before locklock thread2thread1 before lock
0 0
- Linux线程同步---互斥量
- Linux线程同步------互斥量
- Linux线程同步: 互斥量(mutex)
- Linux之线程同步-互斥量
- linux线程同步(1)-互斥量
- Linux线程同步-----互斥量(Mutex)
- linux线程同步(1)-互斥量
- linux 线程 线程同步
- Linux线程同步(2): 互斥量(mutex)
- Linux操作系统线程同步:互斥量(mutex)
- Linux操作系统线程同步:互斥量(mutex)
- Unix/Linux线程同步互斥量的使用
- 线程同步 互斥量(mutex) Linux函数
- Linux线程同步之互斥量(mutex)
- Linux系统编程---线程同步---互斥量
- linux系统编程:线程同步-互斥量(mutex)
- linux 通过互斥量实现线程同步
- 使用互斥量控制Linux线程同步
- iOS事件链的简短总结
- 分页显示记录
- java调用百度短网址api
- Android WebView使用
- 一个序列中有多少个子序列的两头是大于两端值的
- Linux线程同步------互斥量
- A+B十六进制
- C与C++中使用带默认值的参数
- IO流
- [CodeVS1204]寻找字串位置 做题笔记
- 提高应用性能
- 别学框架,学架构
- 【2016.2.18春节训练】Summary
- Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法