linux 读写锁

悠悠 2022-03-12 06:16 290阅读 0赞

转载自https://www.cnblogs.com/wzben/p/5432518.html
读写锁是一个可以分写状态和读状态的锁,可以分别加上写状态或读状态的锁。在读模式的锁下,所有试图以读模式获得它进行加锁的线程都可以获得锁,所有希望以写模式获得它的都会被阻塞。在写模式下,读写锁都被阻塞。读写锁又成共享互斥锁。
简单的说,读模式的加锁下,所有进程都可以获得读锁,但都不能获得写锁。
在写模式下,读写锁就变成了互斥锁,只有一个线程可以获得锁。
例子:
4个线程,全都加锁,不释放锁。

  1. #include <pthread.h>
  2. #include <semaphore.h>
  3. #include <unistd.h>
  4. #include <stdio.h>
  5. #include<fcntl.h>
  6. #include <pthread.h>
  7. #include <errno.h>
  8. int index = 1;
  9. pthread_rwlock_t rwlock;
  10. pthread_mutex_t mutex;
  11. void fun1(void){
  12. int i = 0;
  13. while(i<50){
  14. //if(pthread_mutex_trylock(&mutex)==0){
  15. if(pthread_rwlock_tryrdlock(&rwlock)==0){
  16. printf("In thread 1,lock,index is %d\n",index);
  17. //pthread_mutex_unlock(&mutex);never unlock
  18. }
  19. else
  20. printf("con not get lock in thread 1\n");
  21. if(pthread_rwlock_trywrlock(&rwlock)==EBUSY)
  22. printf("con not write in thread 1\n");
  23. i++;
  24. usleep(100);
  25. }
  26. }
  27. void fun2(void){
  28. int i = 0;
  29. while(i<50){
  30. //if(pthread_mutex_trylock(&mutex)==0){
  31. if(pthread_rwlock_tryrdlock(&rwlock)==0){
  32. printf("In thread 2,lock,index is %d\n",index);
  33. i++;
  34. //pthread_mutex_unlock(&mutex);never unlock
  35. }
  36. else
  37. printf("con not get lock in thread 2\n");
  38. if(pthread_rwlock_trywrlock(&rwlock)==EBUSY)
  39. printf("con not write in thread 2\n");
  40. i++;
  41. usleep(100);
  42. }
  43. }
  44. void fun3(void){
  45. int i = 0;
  46. while(i<50){
  47. //if(pthread_mutex_trylock(&mutex)==0){
  48. if(pthread_rwlock_tryrdlock(&rwlock)==0){
  49. printf("In thread 3,lock,index is %d\n",index);
  50. //pthread_mutex_unlock(&mutex);never unlock
  51. }
  52. else
  53. printf("con not get lock in thread 3\n");
  54. i++;
  55. if(pthread_rwlock_trywrlock(&rwlock)==EBUSY)
  56. printf("con not write in thread 3\n");
  57. usleep(100);
  58. }
  59. }
  60. void fun4(void){
  61. int i = 0;
  62. while(i<50){
  63. //if(pthread_mutex_trylock(&mutex)==0){
  64. if(pthread_rwlock_tryrdlock(&rwlock)==0){
  65. printf("In thread 4,lock,index is %d\n",index);
  66. }
  67. //pthread_mutex_unlock(&mutex);never unlock
  68. else
  69. printf("con not get lock in thread 4\n");
  70. if(pthread_rwlock_trywrlock(&rwlock)==EBUSY)
  71. printf("con not write in thread 4\n");
  72. i++;
  73. usleep(100);
  74. }
  75. }
  76. int main(){
  77. pthread_t tid1,tid2,tid3,tid4;
  78. pthread_mutex_init(&mutex,NULL);
  79. pthread_create(&tid1,NULL,(void*)fun1,NULL);
  80. pthread_create(&tid2,NULL,(void*)fun2,NULL);
  81. pthread_create(&tid3,NULL,(void*)fun3,NULL);
  82. pthread_create(&tid4,NULL,(void*)fun4,NULL);
  83. pthread_join(tid1,NULL);
  84. pthread_join(tid2,NULL);
  85. pthread_join(tid3,NULL);
  86. pthread_join(tid4,NULL);
  87. }

1、互斥锁:
在这里插入图片描述
在线程4获得锁后,由于不释放锁,所以后续的进程都得不到锁。
2、4个进程加上读锁
在这里插入图片描述
由于读锁是共享的,所以就算不释放读锁,每个进程都能获得该锁。

同时,再加上读锁的同时,是不可以写操作的,就是说不能获取写模式。
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,290人围观)

还没有评论,来说两句吧...

相关阅读

    相关

    共享锁(S锁)又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁。这保证了其他事务可以读A,但

    相关 互斥

    一、线程互斥方式。 --- 互斥锁 1、什么是互斥锁?特点怎么样? 互斥锁是专门用于处理线程之间互斥的一种方式,它有两种:上锁状态/解锁状态。 如果互斥锁处于上锁状

    相关

    读写锁是用来解决读者写者问题的,读操作可以共享,写操作是排他的,读可以有多个在读,写只有唯一个在写,同时写的时候不允许读。 具有强读者同步和强写者同步两种形式 强

    相关 Linux】线程同步—

    读写锁与互斥量类似,不过读写锁允许更高的并行性。互斥量只有锁住和不加锁两种状态,且一次只有一个线程可以对其加锁。而读写锁有三种状态:读模式加锁状态,写模式加锁状态,不加锁状态。

    相关 linux

    转载自https://www.cnblogs.com/wzben/p/5432518.html 读写锁是一个可以分写状态和读状态的锁,可以分别加上写状态或读状态的锁。在读模