互斥锁的概念和使用
- 线程通信-互斥
临界资源:一次只允许一个任务(进程、线程)访问的共享资源
临界区:访问临界资源的代码
互斥机制:mutex互斥锁,任务访问临界资源前申请锁,访问完后释放锁 - 互斥锁初始化
两种方法创建互斥锁,静态方式和动态方式
动态方式:
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
其中mutexattr用于指定互斥锁属性,如果为NULL则使用缺省属性。
静态方式:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; - 锁的销毁:
int pthread_mutex_destroy(pthread_mutex_t *mutex)
在Linux中,互斥锁并不占用任何资源,因此LinuxThreads中的 pthread_mutex_destroy()除了检查锁状态以外(锁定状态则返回EBUSY)没有其他动作。 - 互斥锁的使用
int pthread_mutex_lock(pthread_mutex_t *mutex)//mutex 指的是互斥锁对象
int pthread_mutex_unlock(pthread_mutex_t *mutex)
int pthread_mutex_trylock(pthread_mutex_t *mutex)
注:
pthread_mutex_lock 如果无法获取锁,任务阻塞,pthread_mutex_trylock如果无法获取锁,返回EBUSY而不是挂起等待
vim 设置代码全文格式化:gg=G - 代码如下:
- 执行如下:
注:可以发现文件里的字符很乱,因为线程之间没有锁,都在一起执行,就会处乱,所以需要加入互斥锁的概念