线程之间利用信号量协调对共享资源访问的c++代码实现
来源:互联网 发布:mysql 双主 英文描述 编辑:程序博客网 时间:2024/06/06 18:09
首先要了解线程之间的信号量的系统函数
信号量的类型为sem_t
#include<semaphore.h>
int sem_init (sem_t *sem, int pshared, unsigned int value);
这个函数的作用是对由sem指定的信号量进行初始化,设置好它的共享选项,并指定一个整数类型的初始值。
sem为指向信号量结构的一个指针
pshared参数控制着信号量的类型。如果 pshared的值是0,就表示它是当前进程的局部信号量;否则,其它进程就能够共享这个信号量,一般为0。
value给出了信号量的初始值
int sem_wait(sem_t * sem);
对应p操作
int sem_post(sem_t * sem);
对应v操作
关于信号量pv操作可以看信号量集知识整理
int sem_getvalue(sem_t *sem, int *valp);
获得信号量sem的值,并保存到valp中
int sem_destroy (sem_t *sem);
清理信号量的时候如果还有线程在等待它,用户就会收到一个错误。
然而在linux的线程中,其实是没有任何资源关联到信号量对象需要释放的,因此在linux中,销毁信号量对象的作用仅仅是测试是否有线程因为该信号量在等待。如果函数返回0说明没有,正常注销信号量,如果返回EBUSY,说明还有线程正在等待该信号量的信号。
信号量的使用如下步骤小结
1.声明信号量sem_t sem1;
2.初始化信号量sem_init(&sem1,0,1);
3.sem_post和sem_wait函数配合使用来达到线程同步
4.释放信号量int sem_destroy (sem_t *sem1);
下面是实现多线程之间交替打印成对字符的例子
#include<stdio.h>#include<pthread.h>#include<stdlib.h>#include<unistd.h>#include<semaphore.h>sem_t resource;//定义信号量void* f1(void* arg){int i = 0;char c = ((char*)arg)[0];for(;i<10;i++){sem_wait(&resource);//p操作printf("%c",c);fflush(stdout);sleep(rand()%3);printf("%c",c);fflush(stdout);sem_post(&resource);//v操作sleep(rand() % 2);}}int main(){pthread_t t1,t2,t3;sem_init(&resource,0,1);//初始化信号量pthread_create(&t1,NULL,f1,const_cast<char*>("0"));//创建3个线程,并传参要打印的字符,const_cast把const char*转换为char*pthread_create(&t2,NULL,f1,const_cast<char*>("x"));pthread_create(&t3,NULL,f1,const_cast<char*>("#"));pthread_join(t1,NULL);//确保3个线程都执行完毕pthread_join(t2,NULL);pthread_join(t3,NULL);sem_destroy(&resource);//销毁信号量return 0;}
g++ test2.cpp -g -o test2.exe -lpthread
<93 mdsp209 [mct] :/home/mdcc/mct/cpp/shm>./test2.exe
0000xx####xx00##xxxxxxxx0000xx000000xxxxxx00##00############
- 线程之间利用信号量协调对共享资源访问的c++代码实现
- 进程间使用信号量协调对共享资源访问c++代码实现
- 多线程对共享资源的访问
- 信号量实现线程之间的PV操作
- Java: 使用信号量(Semaphore)保护多个共享资源的访问
- 解决线程间对共享资源的竞争
- Python多线程编程,线程之间的协调
- 利用信号量实现线程同步
- 线程之间的信号量 Semaphore
- 1线程概念:线程和进程之间的关系,线程间可共享资源,线程间非共享资源,线程的优缺点
- Linux利用信号量实现线程的同步与互斥
- 进程间 对共享资源的访问 互斥 机制
- Java并发编程-2 对共享资源的访问控制
- 线程共享资源的问题
- GDC dispatch_semaphore 信号量 协调线程同步
- linux多线程编程(C):信号量实现的线程安全队列
- 线程同步3 ------ 信号量实现进程或者线程之间的同步
- 线程同步之semaphore信号量,代码实现
- CSS模块化编码让开发事半功倍
- 20140704-C#object/List<object>与json、xml之间的相互转换
- 字符串时间转化成time_t格式
- 雾山的Anrdoid学习笔记---CheckBox,RadioGroup&RadioButton .
- [Linux筆記] 利用 mount 指令解決 Read-only file system 問題
- 线程之间利用信号量协调对共享资源访问的c++代码实现
- container_of分析
- OTN交换& P-OTN有效降低100G 网络成本 (二)
- c#XML操作
- ZOJ3329-One Person Game(概率DP求数学期望)
- java.util.concurrent介绍
- 我准备在CSDN上写点什么了
- 开源理员t语所示删除赫
- 我是一0后时是使绳今天籽