基于信号量(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;}

运行结果:

这里写图片描述
结果分析:
这是一个读者优先的程序。

0 0