线程安全队列代码

线程安全队列

两个make线程对val进行++时,val应该定义为全局变量
如果将val定义在各自线程内部,val就是局部变量,对val进行++就是在两个线程各自的栈中进行操作

val定义为全局变量时,需要对该全局变量进行加锁

一定要注意线程的独有空间

信号量

采用数组实现一个线程安全队列,模拟信号量

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include <vector>

#define THREAD_NUM 2

class RingQueue
{
    private:
        std::vector<int> vec_;
        size_t capacity_;//队列的容量

        //互斥
        sem_t lock_;
        //同步
        sem_t read_;
        sem_t write_;

        int w_pos_;
        int r_pos_;
    public:
        RingQueue()
            :vec_(4)
        {
            capacity_ = 4;
            sem_init(&lock_, 0, 1);
            sem_init(&read_, 0, 0);
            sem_init(&write_, 0, 4);

            w_pos_ = 0;
            r_pos_ = 0;
        }

        ~RingQueue()
        {
            sem_destroy(&lock_);
            sem_destroy(&read_);
            sem_destroy(&write_);
        }

		生产者调用
        void Push(int data)
        {
            sem_wait(&write_);

            sem_wait(&lock_);
            vec_[w_pos_] = data;
            w_pos_ = (w_pos_ + 1) % capacity_;
            sem_post(&lock_);

            sem_post(&read_);
        }

		消费者调用
        void Pop(int* data)
        {
            sem_wait(&read_);

            sem_wait(&lock_);
            *data = vec_[r_pos_];
            r_pos_ = (r_pos_ + 1) % capacity_;
            sem_post(&lock_);

            sem_post(&write_);
        }
};

void* ReadStart(void* arg)
{
    RingQueue* rq = (RingQueue*)arg;
    while(1)
    {
        int data;
        rq->Pop(&data);
        printf("i am Rd %p, i cum %d\n", pthread_self(), data);
    }
    return NULL;
}

void* WriteStart(void* arg)
{
    RingQueue* rq = (RingQueue*)arg;
    int data = 1;
    while(1)
    {
        rq->Push(data++);
        sleep(1);
    }
    return NULL;
}


int main()
{
    RingQueue* rq = new RingQueue();
    if(rq == NULL)
    {
        return 0;
    }

    pthread_t re[THREAD_NUM], wr[THREAD_NUM];
    for(int i = 0; i < THREAD_NUM; i++)
    {
        int ret = pthread_create(&re[i], NULL, ReadStart, (void*)rq);
        if(ret < 0)
        {
            perror("pthread_create");
            return 0;
        }
        ret = pthread_create(&wr[i], NULL, WriteStart, (void*)rq);
        if(ret < 0)
        {
            perror("pthread_create");
            return 0;
        }
    }

    for(int i = 0; i < THREAD_NUM; i++)
    {
        pthread_join(re[i], NULL);
        pthread_join(wr[i], NULL);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值