互斥量从本质来说是一把锁,在访问共享资源前对互斥量进行设置(加锁),在访问完成后释放(解锁)互斥量。对互斥量进行加锁以后,任何其他试图再次对互斥量加锁的线程都会被阻塞,直到当前线程释放该互斥锁。如果解锁前有一个以上的线程阻塞,那么解锁后这些线程就变为运行状态,直到其中一个线程重新对互斥量加锁,这时其他线程又变为阻塞状态。
为了让线程访问数据不产生冲突,这就需要对变量进行加锁,使得同一时刻只有一个线程访问变量;
当互斥量加锁以后,其他所有需要访问该互斥量的线程都将阻塞;
当互斥量解锁以后,所有因为这个互斥量阻塞的线程都将变为就绪态,第一个获得CPU的线程会获得互斥量,变为运行态,而其他线程会继续变为阻塞,在这种方式下访问互斥量每次只有一个线程能向前执行。
初始化互斥量的两种方法
(1)方法一:静态分配:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
(2)方法二:动态分配:
Int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
销毁互斥量
如果动态分配互斥量(例如,通过调用malloc函数),需要调用pthread_mutex_destroy函数释放内存。
函数原型:int pthread_mutex_destroy(pthread_mutex_t *mutex);
加锁
Int pthread_mutex_lock(pthread_mute_t *mutex)
Int pthread_mutex_trylock(pthread_mute_t *mutex)
解锁
Int phtread_mutex_unlock(pthread_mute_t *mutex)