多线程编程中会涉及公共资源相互竞争问题,就像火车上的厕所,只用一个人可以上,当有人进入后就会加锁。多线程一样为了避免多个线程同时访问公共资源也需要加锁。
一般会用到互斥锁或者自旋锁。
互斥锁线程请求锁,如果请求到加锁执行,然后解锁。如果没有请求到锁,那么就把线程放入等待队列里,将线程挂起。如果持有锁的线程执行完并且释放锁,则会唤醒等待队列里的某个线程去执行,那么它就能获取到锁。互斥锁会涉及线程挂起,导致线程的状态切换(用户态->内核态),这样会有上下文切换,这样性能会有损耗。
Linux内核提供了一系列互斥锁函数以供使用用法很简单:
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//互斥锁
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);//初始化锁
int pthread_mutex_lock(pthread_mutex_t *mutex);//加锁 如果没有获取到锁,阻塞(线程挂起)直到获取到锁,加锁
int pthread_mutex_trylock(pthread_mutex_t *mutex);//尝试加锁,如果获取到锁然后加锁返回0,没有获取到锁返回错误码
int pthread_mutex_unlock(pthread_mutex_t *mutex);//释放指定的锁,这样其他线程可以获取到锁
int pthread_mutex_destroy(pthread_mutex_t *mutex);//销毁