一、互斥锁
- 互斥锁是线程同步最常用的一种方式,可以解决多线程访问共享资源数据混乱的问题。
- 通过互斥锁可以锁定一个代码块,被锁定的这个代码块,所有的线程只能"顺序执行"。
- 但执行效率降低,默认情况下临界区是可以被多个线程并行处理的,现在只能串行处理。
- 一般情况下,每一个共享资源对应一个把互斥锁,锁的个数和线程的个数无关。
#include <pthread.h>
#include <exception>
// 互斥锁
class locker
{
public:
// 初始化互斥锁
locker()
{
if (pthread_mutex_init(&m_mutex, NULL) != 0)
{
throw std::exception();
}
}
// 释放互斥锁资源
~locker()
{
pthread_mutex_destroy(&m_mutex);
}
// 加锁
// 若锁没有被锁定,此线程加锁成功,锁中记录该线程加锁成功。
// 若锁被锁定,其他线程会加锁失败,都会阻塞在这把锁上。
// 锁被解开后,阻塞在锁上的线程就解除阻塞,并且通过竞争的方式对锁进行加锁,没抢到锁的线程继续阻塞。
bool lock()
{
return pthread_mutex_lock(&m_mutex) == 0;
}
// 解锁
// 哪个线程加的锁,哪个线程才能解锁!
bool unlock()
{
return pthread_mutex_unlock