与多进程交互一样,各个不同的线程之间也会存在资源的共享问题。为了解决多线程之间对资源访问的同步和互斥问题,我们需要了解线程同步机制。
第一种机制:互斥锁
互斥锁是一种简单的加锁方法,可以使单个线程进行对资源访问的原子操作。
互斥锁的基本操作就是加锁和解锁。互斥锁主要包含以下函数:
(1) 初始化函数:pthread_mutex_init();
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mutexattr)
函数说明:mutex:互斥锁
mutexattr:(1)PTHREAD_MUTEX_INITILAZER:创建快速互斥锁(一般默认属性是创建这个) (2)PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP:创建递归互斥锁
(3)PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP:创建检测互斥锁
成功返回0,错误返回错误码。
(2)互斥锁上锁:pthread_mutex_lock(pthread_mutex_t *mutex);
判断互斥锁上锁:pthread_mutex_trylock(pthread_mutex_t *mutex);
互斥锁解锁:pthread_mutex_unlock(pthread_mutex_t *mutex);
互斥锁的消除:pthread_mutex_destory(pthread_mutex_t *mutex);
成功返回0,出错返回-1.
第二种机制:信号量
linux实现了POSIX的无名信号量,用于线程中的互斥和同步。信号量就是操作系统中的所用到的PV原子操作。同时适用于进程或线程的同步与互斥。
函数说明:
sem_init()创建一个信号量,并进行初始化
#include <semaphore.h>
int sem_init(sem_t *sem,int pshared,unsigned int value);
函数说明:
sem:信号量的指针
pshared:决定是否信号量被共享,这个值取0,表示当前的局部信号量。
value:需要初始化的值
函数成功返回0,错误返回-1.
sem_wait(sem_t *sem)和sem_trywait(sem_t *sem)相当于P操作,在信号量大于0的时候能够将信号量的值减一;区别是若信号量的值小于0时,sem_wait会将其阻塞,而后者立即返回。
sem_post(sem_t *sem)相当于V操作,它将信号量的值加一
sem_getcalue(sem_t *sem)用于得到信号量的值
sem_destroy(sem_t *sem)用于删除信号量
成功返回0,错误返回-1.
例子会后面补充,参看linux代码类