文档介绍:ljianhui的专栏
如果我只是一片平凡无奇的树叶,我也会努力让自己一直是绿色的!
Linux多线程——使用互斥量同步线程
分类: 初学Linux 2013-09-02 00:10 7570人阅读评论(11) 收藏举报
Linux多线程互斥量信号量线程同步
前文再续,书接上一回,在上一篇文章:Linux多线程——使用信号量同步线
程中,我们留下了一个如何使用互斥量来进行线程同步的问题,本文将会给出互斥量
的详细解说,并用一个互斥量解决上一篇文章中,要使用两个信号量才能解决的只有
子线程结束了对输入的处理和统计后,主线程才能继续执行的问题。
一、什么是互斥量
互斥量是另一种用于多线程中的同步访问方法,它允许程序锁住某个对象,使得每次
只能有一个线程访问它。为了控制对关键代码的访问,必须在进入这段代码之前锁住
一个互斥量,然后在完成操作之后解锁。
二、互斥量的函数的使用
它们的定义与使用信号量的函数非常相似,它们的定义如下:
#include <>
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,程序就会阻塞,而又因为拥有互斥量的这个线程正是现在被阻
塞的线程,所以这个互斥量就永远不会被解锁,也就是说,程序就会进入死锁的状
态。在使用时要多加注意,确保在同一个线程中,对加锁的互斥再次进行加锁前要对
其进行解锁。
1
三、使用互斥量进行线程同步
下面以一个简单的多线程程序来演示如何使用互斥量来进行线程同步。在主线程中,
我们创建子线程,并把数组msg作为参数传递给子线程,然后主线程调用函数
pthread_mutex_lock对互斥量加锁,等待输入,输入完成后,调用函数
pthread_mutex_unlock对互斥量解锁,从而使线程函数中的对互斥量加锁的
pthread_mutex_lock函数返回并执行