码迷,mamicode.com
首页 > 编程语言 > 详细

多线程编程:同时使用信号量与互斥锁

时间:2017-03-17 19:25:33      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:over   return   try   --   lib   images   ...   semaphore   str   

技术分享

#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <cerrno>

#define CUSTOMER_NUM 10
pthread_mutex_t mutex_x= PTHREAD_MUTEX_INITIALIZER;
sem_t sem;
int sem_val = 0;
int iRet;
void * get_service(void *thread_id){

    int customer_id = *((int *)thread_id);

    if(sem_wait(&sem) == 0) {

        sem_getvalue(&sem, &sem_val);
        //printf("\n");

        printf(".......可用窗口 --%d ...\n", sem_val+1);

         iRet=pthread_mutex_trylock(&mutex_x);
        if(iRet==EBUSY){
            printf ("窗口被占用 请更换服务窗口.\n");
        }else if(iRet==0) {
            printf("customer %d receive service  ...\n", customer_id);
            usleep(1000); /* service time: 100ms */
            printf("customer %d receive service  over\n", customer_id);
            pthread_mutex_unlock(&mutex_x);

        }
        sem_post(&sem);
    }
}
int main(int argc, char *argv[]){

    sem_init(&sem,0,2);

    pthread_t customers[CUSTOMER_NUM];
    int i, iRet;

    for(i = 0; i < CUSTOMER_NUM; i++){
        int customer_id = i;
        iRet = pthread_create(&customers[i], NULL, get_service, &customer_id);
        if(iRet){
            perror("pthread_create");
            return iRet;
        }
        else{
            printf("Customer %d arrived.\n", i);
        }
        usleep(200);
    }

    int j;
    for(j = 0; j < CUSTOMER_NUM; j++) {
        pthread_join(customers[j], NULL);
    }

    sem_destroy(&sem);
    return 0;
}

 

多线程编程:同时使用信号量与互斥锁

标签:over   return   try   --   lib   images   ...   semaphore   str   

原文地址:http://www.cnblogs.com/ducong/p/6567730.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!