文章目录
一、互斥锁是什么?
互斥锁是用以保护共享资源的操作,即保护线程对共享资源的操作代码可以完整执行,而不会在访问的中途被其他线程介入对共享资源的访问。通常把对共享资源操作的代码段,称之为临界区,其共享资源也可以称为临界资源。
二、互斥锁的使用
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
参数:
mutex用来指定互斥锁额标识符,类似于ID,其类型为pthread_mutex_t;
attr为互斥锁的属性,一般设置为NULL
2.如果线程加锁成功,则可以访问资源,访问结束之后解锁。
上锁:
int pthread_mutex_lock(pthread_mutex_t *mutex);
解锁:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
3.线程在进行上锁时,其锁资源被其他线程所持有,那么该线程则会执行阻塞等待,等待锁资源被解除后,才可以进行加锁。
4.互斥锁并不能保证线程的执行先后,但却可以保证对共享资源操作的完整性。
释放锁:
pthread_mutex_destroy(pthread_mutex_t *mutex)
一个线程中操作多个互斥锁时,加锁与解锁的顺序一定是相反的!
三、死锁
多个线程对多个互斥锁交叉使用,每一个线程都试图对其他线程所持有的互斥锁进行加锁。例如:有两把锁,当线程A获得一把锁的时候,想要获得另外一把锁,而线程B拥有线程A想要的那把锁,同时,线程B又想要线程A的锁,这样,线程A与线程B都想要拿对方手里的锁,都不肯往下去解锁,导致死锁。
目录