基于信号量(Semaphore)的生产-消费模型和读-写锁
来源:互联网 发布:2017年nba新秀数据 编辑:程序博客网 时间:2024/06/06 03:03
一、 Semaphore(信号量)
Mutex变量是非0即1的,可看作一种资源的可用数量,初始化时Mutex是1,表示有一个可⽤用资源,加锁时获得该资源,将Mutex减到0,表示不再有可⽤用资源,解锁时释放该资源,将Mutex重新加到1,表示又有了一个可⽤用资源。 semaphore变量的类型为
int sem_init(sem_t *sem, int pshared, unsigned int value );
—– pshared通常设置为0,表示线程间的信号量
int sem_wait(sem_t *sem);—- P操作 -1 阻塞式
int sem_trywait(sem_t *sem);
int sem_post(sem_t *sem); —-V操作,释放资源,使 semaphore值加1,同时唤醒挂起等待的线程
int sem_destroy(sem_t *sem); *sem—信号量的地址
二、生产者—消费者模型
设计环形buffer的数据结构(循环链表)—数组为底层数据结构,用一维数组模拟,实现环形队列的无锁编程。
单生产—单消费 ,环形队列代码:
#include<stdio.h>#include<pthread.h>#include<semaphore.h>#include<unistd.h>#include<stdlib.h>#define SIZE 64sem_t blanks, datas;int ring[SIZE];void *producter(void *arg){ int i = 0; while(1){ sem_wait(&blanks); int data = rand()%1234; ring[i] = data; printf("producter done...%d\n", data); i++; i %= SIZE; sem_post(&blanks); sleep(1); }}void *consumer(void *arg){ int i = 0; while(1){ sem_wait(&datas); int data = ring[i]; printf("consumer done...%d\n", data); i++; i %= SIZE; sem_post(&blanks); sleep(1); }}int main(){ sem_init(&blanks, 0, SIZE); sem_init(&datas, 0, 0); pthread_t id1, id2; pthread_create(&id1, NULL, producter, NULL); pthread_create(&id2, NULL, consumer, NULL); pthread_join(id1, NULL); pthread_join(id2, NULL); sem_destroy(&blanks); sem_destroy(&datas); return 0;}
运行结果:
运行结果不是预期中边生产边消费模型,代码有点小问题,目前仍在调试中,若有读者有更好的建议,敬请告知,万分感谢!
三、读–写锁
读写锁实际是一种特殊的⾃旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进⾏行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是互斥性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时既有读者又有写者。
“读写锁”–rdlock,申请不到资源,系统在底层自旋,发生阻塞
代码:
#include<stdio.h>#include<pthread.h>#include<unistd.h>int buf = 0;pthread_rwlock_t rwlock;void *myread(void *arg){ while(1){ if (pthread_rwlock_tryrdlock(&rwlock) != 0){ printf("write is working!\n"); printf("I am do other thing!\n"); continue; }else{ printf("read: %d\n", buf); } sleep(1); }}void *mywrite(void *arg){ while(1){ if (pthread_rwlock_wrlock(&rwlock) != 0){ printf("reader is working!\n"); printf("writer do other thing!\n"); continue; }else{ buf++; pthread_rwlock_unlock(&rwlock); } }}int main(){ pthread_rwlock_init(&rwlock, NULL); pthread_t id1, id2; pthread_create(&id1, NULL, myread, NULL); pthread_create(&id2, NULL, mywrite, NULL); pthread_join(id1, NULL); pthread_join(id2, NULL); pthread_rwlock_destroy(&rwlock); return 0;}
运行结果:
结果分析:
这是一个读者优先的程序。
- 基于信号量(Semaphore)的生产-消费模型和读-写锁
- 基于单链表和环形队列的生产消费模型
- 生产/消费模型的java实现
- 生产/消费模型的java实现
- Wait, notify实现的生产消费模型
- 生产消费模型demo
- 生产-消费模型
- 生产者与消费者模型(基于单链表、环形队列、多线程、多消费多生产)
- Kafka:Kafka的生产和消费(Java版本)
- 生产-消费模式的synchronized和lock实现(十)
- JUC锁-11之 Semaphore信号量的原理和示例
- rocketMq的消息的生产和消费
- kafka消费和生产的xml配置
- 剖析基于并发AQS的共享锁的实现(基于信号量Semaphore)
- java Semaphore信号量的原理和示例
- 线程_生产消费模型
- 8.05(生产和消费线程)
- 生产和消费
- Linux中的gcc
- 林子雨—大数据技术原理与引用—上机实验一
- 高光BRDF 公式参考
- solr服务器部署
- 从线性回归(Linear regression)到逻辑回归(Logistic regression)
- 基于信号量(Semaphore)的生产-消费模型和读-写锁
- 蓝桥 风险度量
- C复习(01)
- WSAEventSelect模型
- STL之vector的基本用法
- Android中HttpConnection+Servlet实现网络请求
- Vmware虚拟化
- Ubuntu下修改DNS服务器地址
- STL简介(转载)