面试:线程的同步方式有哪几种?各有什么特点?

互斥锁:适用于线程可用的资源只有一个,需要互斥访问的情况
条件变量:适用线程之间构成条件等待关系的情况
读写锁:提高互斥锁在数据库系统数据访问(大量读,较少写)等应用领域的效率

华清远见.创客学院.应用程序设计综合教程.p133

2.1 互斥锁
2.1.1 互斥锁原理

互斥锁以排他方式防止共享数据被并发访问。互斥锁是一个二元变量,只有锁定(禁止1)和解锁(允许0)两种状态,互斥锁可以看作是特殊意义的全局变量,因为在同一时刻只有一个线程能够对互斥锁进行操作。
将某个共享资源与某个特定互斥锁在逻辑上绑定,即要申请该资源必须先获取锁。对该共享资源的访问操作如下:

(1) 首先申请互斥锁,如果该互斥锁处于锁定状态,默认阻塞当前线程;如果处于解锁状态,则申请到该锁并立即占有该锁,使锁处于锁定状态防止其他线程访问该资源。
(2) 只有锁定该互斥锁的线程才能释放该互斥锁,其他线程试图释放操作无效。
2.1.2 互斥锁基本操作函数
功能 函数
初始化互斥锁 pthread_mutex_init
阻塞申请互斥锁 pthread_mutex_lock
非阻塞申请互斥锁 pthread_mutex_trylock
释放互斥锁 pthread_mutex_unlock
销毁互斥锁 pthread_mutex_destroy

使用互斥锁前先定义该互斥锁(全局变量)

pthread_mutex_t lock;

1

在使用互斥锁以前,必须首先对它进行初始化

静态分配的互斥锁:置为常量PTHREAD_MUTEX_INITIALIZER,属性为NULL,也可以调用pthread_mutex_init函数

动态分配的互斥锁:例如通过调用malloc函数分配的互斥锁,只能调用pthread_mutex_init,且在释放内存前需要调用pthread_mutex_destroy

1
2
3

(1) 初始化互斥锁
int pthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);

形参:
mutex 要初始化的互斥锁的指针
mutexattr 要初始化的互斥锁的属性;NULL表示使用默认属性

其他:也可使用宏初始化静态分配的互斥锁
#define PTHREAD_MUTEX_INITIALIZER {{0,}}
pthread_mutex_t mp = PTHREAD_MUTEX_INITIALIZER;

返回值:成功返回0,否则返回一个错误编号

1
2
3
4
5
6
7
8
9

(2) 销毁互斥锁
调用pthread_mutex_init初始化的互斥锁,在释放内存前需要调用pthread_mutex_destroy
int pthread_mutex_destroy (pthread_mutex_t *mutex);

形参:
mutex 指向要初始化的互斥锁的指针

返回值:成功返回0,否则返回一个错误编号

1
2
3
4

(3) 阻塞方式申请互斥锁
int pthread_mutex_lock (pthread_mutex_t *mutex);

说明:如果一个线程要占用一个共享资源,必须先申请一个对应的互斥锁

返回值:成功返回0,否则返回一个错误编号

1
2
3

(4) 非阻塞方式申请互斥锁
int pthread_mutex_trylock (pthread_mutex_t *mutex);

返回值:成功返回0,否则返回一个错误编号,以指明错误

1

(5) 释放互斥锁
int pthread_mutex_unlock (pthread_mutex_t *mutex);

说明:释放操作只能有占有该互斥锁的线程完成

返回值:成功返回0,否则返回一个错误编号

https://blog.csdn.net/baidu_35692628/article/details/69356675

猜你喜欢

转载自blog.csdn.net/qq_39054069/article/details/88073570