1、互斥锁
为了保护共享资源,使我们线程可以单独使用这个共享资源,使用之前先上锁,那其他进程要使用的时候,就需要等待到这个线程用完之后,需要开锁。
互斥锁的使用:
帮助文档默认没有安装,我们需要手动安装:sudo apt-get install manpages-posix-dev
声明这个互斥锁:
pthread_mutex_t m;
初始化这个互斥锁:
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);//注意参数取地址;&m
第一个参数:就是我们前面声明的锁,因为这个参数需要传递的是一个锁的指针,所以需要有一个取地址符。
第二个参数:是这个锁的属性,我们让它是默认的属性,这里设置为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
互斥锁:现象:打印aaaaaaabbbbb//代码中的两种方式都可以;
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
pthread_mutex_t m;
void *func(void *arg)
{
pthread_mutex_lock(&m);
char *ptr;
ptr=arg;
while(*ptr!='\0')
{
fprintf(stderr,"%c",*ptr);
usleep(1000);
ptr++;
}
pthread_mutex_unlock(&m);
pthread_exit(NULL);
}
int main()
{
pthread_t tid1,tid2;
int ret=pthread_mutex_init(&m,NULL);
if(ret<0)
{
perror("init fail");
return -1;
}
// pthread_mutex_lock(&m);
pthread_create(&tid1,NULL,func,"aaaaaaaaaaaaaaaa");
pthread_join(tid1,NULL);
// pthread_mutex_unlock(&m);
pthread_create(&tid2,NULL,func,"bbbbbbbbbbbbbbb");
pthread_join(tid2,NULL);
printf("\n");
pthread_mutex_destroy(&m);
return 0;
}
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
读写锁:当为读锁的时候都可以访问,所以随机打印abcabcabc,当为写锁的时候是互斥的,所以可以打印aaaaabbbbbbcccccccc
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
pthread_rwlock_t rwlock;
void *func(void *arg)
{
//pthread_rwlock_rdlock(&rwlock);//读锁
pthread_rwlock_wrlock(&rwlock);//写锁
char *ptr;
ptr=arg;
while(*ptr!='\0')
{
fprintf(stderr,"%c",*ptr);
usleep(1000);
ptr++;
}
pthread_rwlock_unlock(&rwlock);
pthread_exit(NULL);
}
int main()
{
pthread_t tid1,tid2,tid3;
int ret=pthread_rwlock_init(&rwlock,NULL);
if(ret<0)
{
perror("init fail");
return -1;
}
// pthread_mutex_lock(&m);
pthread_create(&tid1,NULL,func,"aaaaaaaaaaaaaaaa");
// pthread_mutex_unlock(&m);
pthread_create(&tid2,NULL,func,"bbbbbbbbbbbbbbb");
pthread_create(&tid3,NULL,func,"ccccccccccccccc");
pthread_join(tid2,NULL);
pthread_join(tid1,NULL);
pthread_join(tid3,NULL);
printf("\n");
pthread_rwlock_destroy(&rwlock);
return 0;
}