1、互斥锁
为了保护共享资源,使我们线程可以单独使用某个共享资源,使用之前先上锁,当其他进程要使用的时候,就需要等待到这个线程用完之后,再开锁。
声明这个互斥锁:
pthread_mutex_t m;
初始化这个互斥锁:
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
第一个参数:就是我们前面声明的锁,因为这个参数需要传递的是一个锁的指针,所以需要有一个取地址符。
第二个参数:是这个锁的属性,我们让它是默认的属性,这里设置为NULL
返回值:成功返回0, 失败返回-1
上锁:锁住某个资源
int pthread_mutex_lock(pthread_mutex_t *mutex); 这个函数是阻塞型,参数传递的是这个锁的指针。
int pthread_mutex_trylock(pthread_mutex_t *mutex); 这个是非阻塞型的,参数传递的是这个锁的指针。
返回值:成功返回0,失败返回-1
解锁:
int pthread_mutex_unlock(pthread_mutex_t *mutex); 这个是解锁的函数,参数传递的是这个锁的指针。
返回值:成功返回0,失败返回-1
销毁这个互斥锁:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
第一个参数:传递的是这个锁的指针。
返回值:成功返回0, 失败返回-1
2、读写锁
为了保护共享资源的访问,这里区分了读的访问和写的访问。
先声明:pthread_rwlock_t rwlock;
初始化:int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
第一个参数:就是我们前面声明的锁,因为这个参数需要传递的是一个锁的指针,所以需要有一个取地址符。
第二个参数:是这个锁的属性,我们让它是默认的属性,这里设置为NULL
返回值:成功返回0,失败返回-1
上锁:
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); 上的是读锁
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock); 上的是读锁,非阻塞型的
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock); 上的是写锁,非阻塞型的
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); 上的是写锁,阻塞型的,如果上了这个写锁,它的作用和互斥锁是一样。
解锁:
pthread_rwlock_unlock();
销毁: int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
第一个参数:传递的是这个锁的指针
返回值:成功返回0, 失败返回-1