在上一篇文章中已经用信号量来实现线程间的互斥,达到了互斥锁的效果,今天这篇文章将讲述怎样用信号量去实现同步。

信号量的互斥同步都是通过PV原语来操作的,我们可以通过注册两个信号量,让它们在互斥的问题上互动,从而达到同步。通过下面实例就可以很容易理解:

[cpp] view plaincopy
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <pthread.h>
  5. #include <semaphore.h>
  6. #include <errno.h>
  7. #define  return_if_fail(p)  if((p) == 0){printf ("[%s]:func error!/n", __func__);return;}
  8. typedef struct _PrivInfo
  9. {
  10. sem_t s1;
  11. sem_t s2;
  12. time_t end_time;
  13. }PrivInfo;
  14. static void info_init (PrivInfo* thiz);
  15. static void info_destroy (PrivInfo* thiz);
  16. static void* pthread_func_1 (PrivInfo* thiz);
  17. static void* pthread_func_2 (PrivInfo* thiz);
  18. int main (int argc, char** argv)
  19. {
  20. pthread_t pt_1 = 0;
  21. pthread_t pt_2 = 0;
  22. int ret = 0;
  23. PrivInfo* thiz = NULL;
  24. thiz = (PrivInfo* )malloc (sizeof (PrivInfo));
  25. if (thiz == NULL)
  26. {
  27. printf ("[%s]: Failed to malloc priv./n");
  28. return -1;
  29. }
  30. info_init (thiz);
  31. ret = pthread_create (&pt_1, NULL, (void*)pthread_func_1, thiz);
  32. if (ret != 0)
  33. {
  34. perror ("pthread_1_create:");
  35. }
  36. ret = pthread_create (&pt_2, NULL, (void*)pthread_func_2, thiz);
  37. if (ret != 0)
  38. {
  39. perror ("pthread_2_create:");
  40. }
  41. pthread_join (pt_1, NULL);
  42. pthread_join (pt_2, NULL);
  43. info_destroy (thiz);
  44. return 0;
  45. }
  46. static void info_init (PrivInfo* thiz)
  47. {
  48. return_if_fail (thiz != NULL);
  49. thiz->end_time = time(NULL) + 10;
  50. sem_init (&thiz->s1, 0, 1);
  51. sem_init (&thiz->s2, 0, 0);
  52. return;
  53. }
  54. static void info_destroy (PrivInfo* thiz)
  55. {
  56. return_if_fail (thiz != NULL);
  57. sem_destroy (&thiz->s1);
  58. sem_destroy (&thiz->s2);
  59. free (thiz);
  60. thiz = NULL;
  61. return;
  62. }
  63. static void* pthread_func_1 (PrivInfo* thiz)
  64. {
  65. return_if_fail (thiz != NULL);
  66. while (time(NULL) < thiz->end_time)
  67. {
  68. sem_wait (&thiz->s2);
  69. printf ("pthread1: pthread1 get the lock./n");
  70. sem_post (&thiz->s1);
  71. printf ("pthread1: pthread1 unlock/n");
  72. sleep (1);
  73. }
  74. return;
  75. }
  76. static void* pthread_func_2 (PrivInfo* thiz)
  77. {
  78. return_if_fail (thiz != NULL);
  79. while (time (NULL) < thiz->end_time)
  80. {
  81. sem_wait (&thiz->s1);
  82. printf ("pthread2: pthread2 get the unlock./n");
  83. sem_post (&thiz->s2);
  84. printf ("pthread2: pthread2 unlock./n");
  85. sleep (1);
  86. }
  87. return;
  88. }

通过执行结果后,可以看出,会先执行线程二的函数,然后再执行线程一的函数。它们两就实现了同步。在上大学的时候,虽然对这些概念知道,可都没有实践过,所以有时候时间一久就会模糊甚至忘记,到了工作如果还保持这么一种状态,那就太可怕了。虽然现在外面的技术在不断的变化更新,可是不管怎么变,其核心技术还是依旧的,所以我们必须要打好自己的基础,再学习其他新的知识,那时候再学新的知识也会觉得比较简单的。闲话多说了两句,在下一篇文章中,我们将会实现一个经典的实例回顾这段时间对多线程的学习,那就是消费者和生产者。

~~END~~

linux多线程学习(六)——信号量实现同步相关推荐

  1. linux多线程学习(五)——信号量线程控制

    在上一篇文章中,讲述了线程中互斥锁的使用,达到对共享资源互斥使用.除了使用互斥锁,信号量,也就是操作系统中所提到的PV原语,能达到互斥和同步的效果,这就是今天我们所要讲述的信号量线程控制. PV原语是 ...

  2. 艾伟:C#多线程学习(六) 互斥对象

    本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习( ...

  3. C#多线程学习(六) 互斥对象

    C#多线程学习(六) 互斥对象 原文链接:http://kb.cnblogs.com/page/42533/ 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个 ...

  4. 【Linux多线程】三个经典同步问题

    在了解了<同步与互斥的区别>之后,我们来看看几个经典的线程同步的例子.相信通过具体场景可以让我们学会分析和解决这类线程同步的问题,以便以后应用在实际的项目中. 一.生产者-消费者问题 问题 ...

  5. 【转】细说.NET中的多线程 (五 使用信号量进行同步)

    上一节主要介绍了使用锁进行同步,本节主要介绍使用信号量进行同步 使用EventWaitHandle信号量进行同步 EventWaitHandle主要用于实现信号灯机制.信号灯主要用于通知等待的线程.主 ...

  6. Unity基础学习六,网络同步

    1.什么是网络同步 所谓同步,就是要多个客户端表现效果是一致的,比如我们玩王者荣耀的时候,需要十个玩家的屏幕显示的英雄位置完全相同.技能释放角度.释放时间完全相同,这个就是同步. 2.为什么要有网络同 ...

  7. linux多线程学习(七)——实现“生产者和消费者”

    在上一篇文章中,利用信号量实现了线程间的互斥,这一篇将要利用信号量的互斥同步机制来实现一个经典实例,就是"生产者和消费者". 1.简单描述生产者和消费者的问题. 有一个缓冲区和两个 ...

  8. linux多线程学习(二)——线程的创建和退出

    在上一篇文章中对线程进行了简单的概述,它在系统中和编程的应用中,扮演的角色是不言而喻的.学习它.掌握它.吃透它是作为一个程序员的必须作为.在接下来的讲述中,所有线程的操作都是用户级的操作.在LINUX ...

  9. linux多线程学习(一)

    进程是系统中程序执行和资源分配的基本单位.每个进程都有自己的数据段,代码段和堆栈段,这就导致了进程在进行切换等操作起到了现场保护作用.但是为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销 ...

最新文章

  1. Apache Libcloud 0.12.3 发布
  2. Java多线程——线程的优先级和生命周期
  3. jena 学习思路(转)
  4. Java概述、环境变量、注释、关键字、标识符、常量
  5. 使用DOM4J解析XML时非法字符Exception
  6. python bootstrap_Python-bootstrap
  7. 然并卵,苹果还是那个掉队的巨头
  8. 利用NSFileManager获取文件(文件夹)列表
  9. python装饰器作用噜咕_浅谈python中的装饰器
  10. PMP助力!让你成功转型项目管理
  11. centos7 中彻底卸载mysql
  12. 《代码大全》个人总结
  13. w ndows 10关机快捷键,win10怎么关机 win10关机快捷键大全【图文演示】
  14. Unity app 如何打开商店
  15. USB2.0系列(锆石科技FPGA)
  16. 红帽 Linux Redhat6.4安装MySQL 5.1
  17. 微信公众平台js算法逆向
  18. 计算机操作上机考试题目,计算机系统操作工上机操作考试题.pdf
  19. 无法连接虚拟设备sata的原因
  20. 实现点击不同的按钮显示不同的内容【同一页面】web

热门文章

  1. 是什么职位_2021国家公务员考试职位表出炉!你真的了解什么是公务员吗?
  2. java生成折线图,饼状图,柱形图
  3. java遮罩层_页面遮罩层 - javaalex的个人空间 - OSCHINA - 中文开源技术交流社区
  4. 如何修改mysql物理文件存放地址_如何防封号物理地址和网络地址修改攻略
  5. iphone控制电脑_苹果远程控制电脑软件免费下载-超控Controlax(iPhone远程控制Windows)v1.1 最新版...
  6. 2018-2019-1 20165227 20165228 20165237 实验五 通讯协议设计
  7. 《C++ Primer Plus》16.2 智能指针模板类
  8. BP的matlab实现
  9. Android开发学习之路-PopupWindow和仿QQ左滑删除
  10. [转]学习c++的50条忠告