线程同步-信号量
来源:互联网 发布:网络销售客服工作内容 编辑:程序博客网 时间:2024/06/08 15:18
1.信号量的数据类型sem_t本质是一个长整型的数,相关头文件semaphore.h
2.信号量初始化
原型:extern int sem_init (sem_t *__sem, int __pshared, unsigned int __value)
参数:sem是一个信号量指针;
pshared为0只能在当前进程的所有线程间共享,否则在进程间共享
value指的信号量的初始值,这里一般为0
说明:linux线程一般不支持进程间的信号量共享,pshared为非0会报错
3.信号量控制函数
原型:extern int sem_post (sem_t *__sem)和extern int sem_wait (sem_t *__sem)
参数:sem初始化过的信号量指针
说明:前者作用是为信号量的值加1,后者对信号量的值减1,当信号量为0后者阻塞等待,前者执行
如果有两个线程都在等待同一个信号量变成非0值,那么被第三个线程改变信号量时,只能
有一个线程可以对信号量做减法,另一个继续等待
4.获取信号量的值
原型:extern int sem_getvalue (sem_t *__restrict __sem, int *__restrict __sval)
参数:sem初始化过的信号量指针
sval为一个int型的指针,保存信号量的值
5.销毁信号量
原型:extern int sem_destroy (sem_t *__sem)
a=0
sem_init done!
thread1--sem_wait
value1=0
thread2--sem_wait
thread3---sem_post
value3=0
thread3 sem_post done!
value3=1
thread3 is runing!
thread1 sem_wait done!
value1=0
thread1 is runing!
thread3 get word is:q
thread1 get word is:w
thread3 is runing!
thread3 get word is:e
thread1 is runing!
thread1 get word is:r
thread3 is runing!
thread3 get word is:t
thread1 is runing!
thread1 get word is:
2.信号量初始化
原型:extern int sem_init (sem_t *__sem, int __pshared, unsigned int __value)
参数:sem是一个信号量指针;
pshared为0只能在当前进程的所有线程间共享,否则在进程间共享
value指的信号量的初始值,这里一般为0
说明:linux线程一般不支持进程间的信号量共享,pshared为非0会报错
3.信号量控制函数
原型:extern int sem_post (sem_t *__sem)和extern int sem_wait (sem_t *__sem)
参数:sem初始化过的信号量指针
说明:前者作用是为信号量的值加1,后者对信号量的值减1,当信号量为0后者阻塞等待,前者执行
如果有两个线程都在等待同一个信号量变成非0值,那么被第三个线程改变信号量时,只能
有一个线程可以对信号量做减法,另一个继续等待
4.获取信号量的值
原型:extern int sem_getvalue (sem_t *__restrict __sem, int *__restrict __sval)
参数:sem初始化过的信号量指针
sval为一个int型的指针,保存信号量的值
5.销毁信号量
原型:extern int sem_destroy (sem_t *__sem)
参数:sem初始化过的信号量指针
测试:
#include <pthread.h>#include"/home/zxd/zxd/semaphore.h"#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>FILE *fp;sem_t bin_sem;//定义全局变量void *thread1(void *arg){ int m; int value1; printf("thread1--sem_wait\n"); sem_getvalue(&bin_sem,&value1); printf("value1=%d\n",value1); sem_wait(&bin_sem); printf("thread1 sem_wait done!\n"); sem_getvalue(&bin_sem,&value1); printf("value1=%d\n",value1); while (1) { printf("thread1 is runing!\n"); if((m=fgetc(fp))!=EOF) { printf("thread1 get word is:%c\n",m); } else { exit(0);//读完退出 } sleep(1); }}void *thread2(void *arg){ int m; printf("thread2--sem_wait\n"); sem_wait(&bin_sem); printf("thread2 sem_wait done!\n"); while (1) { printf("thread2 is runing!\n"); if((m=fgetc(fp))!=EOF) { printf("thread2 get word is:%c\n",m); } else { exit(0);//读完退出 } sleep(1); }}void *thread3(void *arg){ int n; int value3; printf("thread3---sem_post\n"); sem_getvalue(&bin_sem,&value3); printf("value3=%d\n",value3); sem_post(&bin_sem); printf("thread3 sem_post done!\n"); sem_getvalue(&bin_sem,&value3); printf("value3=%d\n",value3); while (1) { printf("thread3 is runing!\n"); if((n=fgetc(fp))!=EOF) { printf("thread3 get word is:%c\n",n); } else { exit(0);//读完退出 } sleep(1); }}int main(){ int res; pthread_t a_thread; void *thread_result; int a; fp=fopen("/home/zxd/zxd/1.txt","r"); res = sem_init(&bin_sem, 0,0); sem_getvalue(&bin_sem,&a); printf("a=%d\n",a); if (res != 0) { perror("sem_init error!\n"); } printf("sem_init done!\n"); res = pthread_create(&a_thread, NULL, thread1, NULL); if (res != 0) { perror("thread1 create error!\n"); } sleep(5); res = pthread_create(&a_thread, NULL, thread2, NULL); if (res != 0) { perror("thread2 create error!\n"); } res = pthread_create(&a_thread, NULL, thread3, NULL); if (res != 0) { perror("thread3 create error!\n"); } sleep(1); while (1) { sleep(3);//等待线程工作防止程序退出 } return 0;}测试结果:
编译:gcc xhl.c -lpthread
[root@libmaster zxd]# ./a.outa=0
sem_init done!
thread1--sem_wait
value1=0
thread2--sem_wait
thread3---sem_post
value3=0
thread3 sem_post done!
value3=1
thread3 is runing!
thread1 sem_wait done!
value1=0
thread1 is runing!
thread3 get word is:q
thread1 get word is:w
thread3 is runing!
thread3 get word is:e
thread1 is runing!
thread1 get word is:r
thread3 is runing!
thread3 get word is:t
thread1 is runing!
thread1 get word is:
阅读全文
0 0
- JAVA 线程 同步 信号量
- JAVA 线程 同步 信号量
- 线程信号量同步
- 线程同步之信号量
- 线程同步-信号量
- 线程同步----信号量(Semaphore)
- 线程的同步--信号量
- delphi 信号量线程同步
- 线程同步--使用信号量
- 线程同步(信号量)
- 信号量实现线程同步
- 4线程同步:信号量
- 信号量---线程同步
- 线程同步----信号量(Semaphore)
- 线程同步:信号量
- 线程同步之信号量
- 信号量---线程同步
- linux 线程同步 信号量
- 线性表链接存储(单链表)
- arcgis api for javascrpit 基于dojo框架的query查询功能2
- 你想怎样工作?平淡无奇还是激情四射?
- 02 js基础 BOM
- 深入浅出了解 JavaScript 中的 this
- 线程同步-信号量
- Android ListView异步加载图片乱序问题,原因分析及解决方案
- 海云安:利益博弈,APP安全漏洞背后的攻防交锋
- 如何在vue里面优雅的解决跨域,路由冲突问题
- spring cloud的入门级别的系统搭建
- 关于获取应用basePath
- hadoop创建本地yum版本库
- 欢迎使用CSDN-markdown编辑器
- 网站视频下载破解 以及 Mac 下视频格式转换