基于信号量(Semaphore)的生产-消费模型和读-写锁

一、 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 64
sem_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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值