linux信号进程同步,linux信号量之进程间同步

概念

linux信号量:允许多个线程同时进入临界区,可以用于进程间的同步。

和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区。

所在头文件:semaphore.h

主要函数

初始化函数

int sem_init(sem_t *sem, int pshared, unsigned int value)

sem:要初始化的信号量

pshared:此信号量是在进程间共享还是线程间共享

value:信号量的初始值

删除函数

int sem_destroy(sem_t *sem)

sem:要销毁的信号量

注意:只有用sem_init初始化的信号量才能用sem_destroy销毁

等待信号量函数

int sem_wait(sem_t *sem)

功能:等待信号量,如果信号量的值大于0,将信号量的值减1,立即返回;

如果信号量的值为0,则线程阻塞。相当于P操作。

成功返回0,失败返回-1。

释放信号量

int sem_post(sem_t *sem)

功能:释放信号量,让信号量的值加1。相当于V操作。

例程

例程描述:

该例程的主要目的,在于模仿异步执行命令。所谓异步执行命令,就是说一个进程用于接收发送命令,另外一个进程用于实际执行命令。实际工程中,经常会遇到有许多种命令要在一个进程中得到解析并执行,有些命令耗时短,可以在此进程中完成;但是,有些命令耗时长,如果也放在这个进程中,则影响该进程接收(其他命令)。所以,此时可以考虑用异步执行的方案,将耗时短的命令,就放在接收解析进程中;而将耗时长的命令,则用异步执行的方案,将接收与实际执行分离,以避免接收受到严重阻塞。

本例程中,用主线程创建了两个子线程pthread1和pthread2,其中线程pthread1用于产生和发送命令,而线程pthread2用于实际执行命令。

1 #include

2 #include

3 #include

4 #include

5

6 /*将信号量定义为全局变量,方便多个线程共享*/

7 sem_t sem;8

9 /*线程1和线程2的公用命令*/

10 int gCmd = 0;11

12 /*同步线程1和线程2的全局变量*/

13 static int gIsExecFlag = 0;14

15 /*定义线程pthread1*/

16 static void * pthread1(void *arg)17 {18 /*线程pthread1开始运行*/

19 printf("pthread1 start!\n");20

21 while(1)22 {23 /*等待没有命令正在执行*/

24 while(gIsExecFlag);25

26 /*更新命令*/

27 gCmd++;28 if(gCmd == 10)29 {30 /*释放信号量*/

31 sem_post(&sem);32

33 /*发送命令结束*/

34 returnNULL;35 }36

37 /*释放信号量*/

38 sem_post(&sem);39

40 /*等待线程2执行命令*/

41 sleep(1);42 }43 }44

45 /*定义线程pthread2*/

46 static void * pthread2(void *arg)47 {48 inttmp;49

50 /*线程pthread2开始运行*/

51 printf("pthread2 start!\n");52

53 while(1)54 {55 if (sem_wait(&sem) != 0)56 {57 printf("Error!\n");58 }59

60 /*正在执行的标志置1*/

61 gIsExecFlag = 1;62

63 /*线程2接受来自线程1的命令,并打印*/

64 tmp =gCmd;65 printf("now execute the cmd,and the code of cmd is %d.\n", tmp);66

67 /*执行命令需要时间:3s*/

68 sleep(3);69

70 /*正在执行的标志清0*/

71 gIsExecFlag = 0;72

73 if(gCmd == 10){74 /*命令执行结束*/

75 returnNULL;76 }77 }78 }79

80 /*main函数*/

81 int main(int agrc,char*argv[])82 {83 pthread_t tidp1,tidp2;84

85 /*初始化信号量sem*/

86 sem_init(&sem, 0, 0);87

88 /*创建线程pthread1*/

89 if ((pthread_create(&tidp1, NULL, pthread1, NULL)) == -1)90 {91 printf("create error!\n");92 return 1;93 }94

95 /*同步,让线程1先执行*/

96 usleep(10);97

98 /*创建线程pthread2*/

99 if ((pthread_create(&tidp2, NULL, pthread2, NULL)) == -1)100 {101 printf("create error!\n");102 return 1;103 }104

105 /*等待线程pthread1释放*/

106 if(pthread_join(tidp1, NULL))107 {108 printf("thread is not exit...\n");109 return -2;110 }111

112 /*等待线程pthread2释放*/

113 if(pthread_join(tidp2, NULL))114 {115 printf("thread is not exit...\n");116 return -2;117 }118

119 return 0;120 }

原文:http://www.cnblogs.com/amanlikethis/p/5540364.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值