面试题答案
一键面试互斥锁的作用
互斥锁(Mutex,即Mutual Exclusion的缩写)是一种特殊的二元信号量,主要用于线程同步。其作用是保证在同一时刻只有一个线程能够访问共享资源,以避免出现数据竞争和不一致的情况,确保共享资源的完整性和一致性。
使用步骤
- 初始化互斥锁:在使用互斥锁之前,需要对其进行初始化。可以使用
pthread_mutex_init
函数来完成初始化。pthread_mutex_t mutex; int ret = pthread_mutex_init(&mutex, NULL); if (ret != 0) { // 处理初始化错误 }
- 加锁:当线程需要访问共享资源时,先调用
pthread_mutex_lock
函数对互斥锁进行加锁操作。如果互斥锁已经被其他线程锁住,调用线程将被阻塞,直到互斥锁被解锁。ret = pthread_mutex_lock(&mutex); if (ret != 0) { // 处理加锁错误 }
- 访问共享资源:加锁成功后,线程可以安全地访问共享资源。
- 解锁:访问完共享资源后,调用
pthread_mutex_unlock
函数对互斥锁进行解锁操作,以便其他线程能够获取互斥锁并访问共享资源。ret = pthread_mutex_unlock(&mutex); if (ret != 0) { // 处理解锁错误 }
- 销毁互斥锁:在不再需要使用互斥锁时,调用
pthread_mutex_destroy
函数对互斥锁进行销毁。ret = pthread_mutex_destroy(&mutex); if (ret != 0) { // 处理销毁错误 }
未正确使用互斥锁可能出现的问题
- 数据竞争:多个线程同时访问和修改共享资源,导致最终的结果取决于线程执行的顺序,产生不可预测的错误。例如多个线程同时对一个计数器变量进行自增操作,可能会导致计数结果小于正确值。
- 脏读:一个线程读取到了另一个线程未完全修改完成的共享数据,从而得到错误的数据。
- 死锁:如果多个线程以不同的顺序获取多个互斥锁,可能会导致每个线程都持有一个锁并等待另一个线程持有的锁,从而形成死锁,所有线程都无法继续执行。