经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
使用读写锁实现线程同步
来源:cnblogs  作者:Lance#  时间:2018/9/25 20:32:49  对本文有异议

简介:


读写锁与互斥量类似,但读写锁允许更高的并行性。其特性为:写独占,读共享。


读写锁特性:


  1. 读写锁是“写模式加锁”时,解锁前,所有对该锁加锁的线程都会被阻塞。

  2. 读写锁是“读模式加锁”时,如果线程以读模式对其加锁会成功。如果线程以写模式加锁会阻塞。

  3. 读写锁是“读模式加锁”时,如果有另外线程试图以写模式加锁,读写锁通常会阻塞随后的读模式锁请求,这样可以避免读模式锁长期占用,而等待的写模式锁请求长期阻塞;

    读写锁非常适合于对数据结构读的次数远大于写的情况。


应用实例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <unistd.h>
  5. pthread_rwlock_t rwlock;
  6. void *pthread_one(void *arg)
  7. {
  8. /* 分别测试先上写锁和先上读锁的情况 */
  9. //pthread_rwlock_wrlock(&rwlock);
  10. pthread_rwlock_rdlock(&rwlock);
  11. //puts("wrlock locked first, pthread one!");
  12. puts("rdlock locked first, pthread one!");
  13. sleep(2);
  14. puts("after sleep 2s");
  15. pthread_rwlock_unlock(&rwlock);
  16. }
  17. void *pthread_two(void *arg)
  18. {
  19. pthread_rwlock_rdlock(&rwlock);
  20. puts("got the rdlock, pthread two!");
  21. }
  22. int main()
  23. {
  24. int i = 0;
  25. pthread_t id[2];
  26. /* 读写锁初始化 */
  27. pthread_rwlock_init(&rwlock, NULL);
  28. pthread_create(&id[0], NULL, pthread_one, NULL);
  29. sleep(1);
  30. pthread_create(&id[1], NULL, pthread_two, NULL);
  31. for(; i<2; i++)
  32. pthread_join(id[i], NULL);
  33. /* 销毁读写锁 */
  34. pthread_rwlock_destroy(&rwlock);
  35. return 0;
  36. }

运行结果(两种情况):

参考自:www.aliyun.com/jiaocheng/143521.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号