线程间通讯《互斥锁,读写锁》

 

 

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;

}

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/weixin_41723504/article/details/81516794
今日推荐