pthreads 使用 pthread_mutex_t 类型的变量来表示互斥量,同时在使用互斥量进行同步前须要先对它进行初始化,能够用静态或动态的方式对互斥量进行初始化。
函数
对于静态分配的 pthread_mutex_t 变量来讲,只要将 PTHREAD_MUTEX_INITIALIZER赋给变量就好了。
spa
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
对于动态分配或者不使用默认属性的互斥变量来讲,须要调用 pthread_mutex_int()函数来执行初始化工做。 pthread_mutex_int()函数原型以下:
线程
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
参数 mutex 是一个指向要初始化的互斥量的指针;参数 attr 传递 NULL 来初始化一个带有默认属性的互斥量,不然就要用相似于线程属性对象所使用的方法,先建立互斥量属性对象,再用该属性对象来建立互斥量。
指针
函数成功返回 0,不然返回一个非 0 的错误码, 表 13.5 列出 pthread_mutex_init 出错的错误码。
rest
静态初始化程序一般比调用 pthread_mutex_init 更有效,并且在任何线程开始执行以前,确保变量被初始化一次。
code
销毁互斥量使用 pthread_mutex_destroy()函数,原型以下:
对象
int pthread_mutex_destroy(pthread_mutex_t *mutex);
参数 mutex 指向要销毁的互斥量。如下代码销毁了 mylock 互斥量:
blog
int error; pthread_mutex_t mylock; if (error = pthread_mutex_destroy(&mylock)) fprintf(stderr, "Failed to destroy mylock : %s\n", strerror(error));
pthreads 中有两个试图锁定互斥量的函数, pthread_mutex_lock()和 pthread_mutex_trylock()。pthread_mutex_lock()函数会一直阻塞到互斥量可用为止,而 pthread_mutex_trylock()则尝试加锁, 但一般会当即返回。函数原型以下:
原型
int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex);
pthread_mutex_unlock()函数用来释放指定的互斥量。函数原型以下:
同步
int pthread_mutex_unlock(pthread_mutex_t *mutex);
当多个线程须要相同的一些锁, 可是按照不一样的顺序加锁, 死锁就很容易发生, 若是能确保全部的线程都是按照相同的顺序得到锁,那么死锁就不会发生。 例如,规定程序内有三个互斥锁的加锁顺序为 mutexA->mutexB->mutexC,则线程 t1、 t2、 t3 线程操做伪代码以下所示: