mutex destroy while busy

问题原因 ,锁在busy中被销毁。可能出现的问题是 mutex执行完lock并没有被unlock就出问题了 比如说

   void fun() {
        mutex m;
        int a = 1;
        m.lock();
        if (a > 0) {
            return;
        }
        m.unlock();
    }

若m没有被unlock 销毁锁的内存则会出错!

#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<pthread.h> #include<semaphore.h> #include<time.h> #define inc(k) if(k<BUFFER_SIZE)k=k+1;else k=0 #define BUFFER_SIZE 10//缓冲区的大小 typedef int buffer_item;//定义缓冲区内的数据类型 buffer_item buffer[BUFFER_SIZE];//缓冲区 int in,out;//对缓冲区操作的变量,in表示缓冲区中下一个等待接收产品的空缓冲的下标,out表示下一个要被取走的产品所在满缓冲的下标 pthread_mutex_t mutex;//信号量mutex提供了对缓冲池访问的互斥要求 sem_t empty,full;//信号量empty和full分别表示空缓冲和满缓冲的个数 int pro_speed,con_speed;//可以设定生产者的生产速度及消费者的消费速度 int insert_item(buffer_item item) {//将生产的产品放入缓冲区 buffer[in]=item; printf("->->将产品%d放入缓冲池第%d号\n",item,in); inc(in); } int remove_item(buffer_item *item) { //从缓冲区内移走一个产品 *item = buffer[out]; printf("->->从缓冲池取出第%d号产品%d\n",out,item); inc(out); } /* 生产者线程 */ void *producer(void *param) { buffer_item item; int num = 0; // 记录生产的产品个数 while(1) { sleep(rand()%(16-pro_speed)); printf("\n******第%d次生产******\n",++num); printf("---等待empty信号\n"); sem_wait(&empty); printf("---仓库中有空位,申请进入仓库\n"); pthread_mutex_lock(&mutex); printf("---进入仓库,上锁,准备生产\n"); item=rand()%1000+1; printf("---生产产品%d\n",item); insert_item(item); printf("---解锁,出仓库\n"); pthread_mutex_unlock(&mutex); sem_post(&full); printf("---释放full信号\n"); printf("******第%d次生产结束******\n\n",num); } } /* 消费者线程 */ void *consumer(void *param) { buffer_item item; int num = 0; while(1){ sleep(rand()%(16-con_speed)); printf("\n******第%d次消费******\n",++num); printf("---等待full信号\n"); sem_wait(&full); printf("---仓库中有产品,申请进入仓库\n"); pthread_mutex_lock(&mutex); printf("---进入仓库,上锁,准备消费\n"); remove_item(&item); printf("---消费产品%d\n",item); printf("---解锁,出仓库\n",num); pthread_mutex_unlock(&mutex); sem_post(&empty); printf("---释放empty信号\n"); printf("******第%d次消费结束\n\n",num); } } int main(void)//主函数 { pthread_t thread_p,thread_c; srand(time(NULL)); //设置随机数种子 /* 初始化 */ pthread_mutex_init(&mutex,NULL); sem_init(&empty,0,BUFFER_SIZE); sem_init(&full,0,0); in=0; out=0; printf("=======================\n"); printf("设置生产者、消费者速度\n"); printf("生产者速度(1-15):\n"); scanf("%d",&pro_speed); printf("消费者速度(1-15):\n"); scanf("%d",&con_speed); printf("=======================\n"); /* 创建生产者、消费者线程 */ pthread_create(&thread_p,NULL,producer,NULL); pthread_create(&thread_c,NULL,consumer,NULL); /* 回收 */ pthread_join(thread_p, NULL); pthread_join(thread_c, NULL); pthread_mutex_destroy(&mutex); sem_destroy(&empty); sem_destroy(&full); printf("========程序over========\n"); return 0; } 参照以上程序,根据以下情景生成程序 服务器处理客户端请求时,若当前请求数超过服务器处理能力,新请求需进入队列等待。服务器空闲时进入休眠状态,直到有新请求到达。某服务器可同时处理 3 个请求,最多支持 5 个请求排队等待,当服务器空闲时,从队列中唤醒请求处理。设计信号量同步机制,确保服务器与客户端的正确协作。
最新发布
03-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值