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

#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;
}
时间: 2024-12-29 12:53:25

多线程编程:同时使用信号量与互斥锁的相关文章

【原】多线程编程中临界区与互斥锁的区别

临界区和互斥锁的区别1.临界区只能用于对象在同一进程里线程间的互斥访问:互斥锁可以用于对象进程间或线程间的互斥访问.2.临界区是非内核对象,只在用户态进行锁操作,速度快:互斥锁是内核对象,在核心态进行锁操作,速度慢.3.临界区和互斥体在Windows平台都下可用:Linux下只有互斥锁可用

编程之美--信号量与互斥锁选择(转)

编程之美--多线程高效下载的问题 2011-03-27 15:27:12 分类: C/C++ 基本的思路: 这个问题相当于是生产者和消费者模型的问题 首先定义两个线程,一个是下载线程,一个是存储线程,下载线程将数据从网络上下载到相应的数据的缓冲区中(BLOCK组成的队列).存储的线程从数据缓冲区中读取相应的数据,并将其写到相应的磁盘上去. 多线程同步的方式有:CriticalSection.Mutex和Semaphore(信号量).因为CriticalSection和Mutex,将不会使下载线程

信号量与互斥锁

信号量与普通整型变量的区别: ①信号量(semaphore)是非负整型变量,除了初始化之外,它只能通过两个标准原子操作:wait(semap) , signal(semap) ; 来进行访问: ②操作也被成为PV原语(P来源于Dutch proberen"测试",V来源于Dutch verhogen"增加"),而普通整型变量则可以在任何语句块中被访问: 信号量与互斥锁之间的区别: 1. 互斥量用于线程的互斥,信号线用于线程的同步. 这是互斥量和信号量的根本区别,也就

条件变量、信号量、互斥锁

转载 http://blog.csdn.net/yusiguyuan/article/details/14161225 线程间的同步技术,主要以互斥锁和条件变量为主,条件变量和互斥所的配合使用可以很好的处理对于条件等待的线程间的同步问题.举个例子:当有两个变量x,y需要在多线程间同步并且学要根据他们之间的大小比较来启动不同的线程执行顺序,这便用到了条件变量这一技术.看代码 1 #include <iostream> 2 #include <pthread.h> 3 using na

详解线程的信号量和互斥锁

前言:有个问题感觉一直会被问道:进程和线程的区别?也许之前我会回答: 进程:资源分配最小单位 线程:轻量级的进程 是系统调度的最小单位 由进程创建 多个线程共享进程的资源 但是现在我觉得一个比喻回答的更好:程序就像静止的火车,进程是运行的火车,线程是运行火车的每节车厢. 个人感觉理解远比背些概念性东西更好. 一.线程 通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义.线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而

信号量和互斥锁

信号量与互斥锁的异同: 1.信号量与互斥锁最根本的不同点在于:互斥锁的取值只能是0或者1,而信号量的取值范围则可以定义. 2.信号量的作用域可以进程也可以是线程,而互斥锁只能是线程. 简单来说互斥锁可以实现线程对于唯一资源的使用保护,而信号量则可以实现多线程或者进程间数量有限资源的使用保护.从某种意义上讲互斥锁是只能一个资源可用的信号量. 作者:CSDN链接:https://zhuanlan.zhihu.com/p/84107070来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转

多线程编程之信号量

一.信号量(semaphore) mutex变量是非0即1的,可看作一种资源的可用数量,初始化时mutex是1,表示有一个可用资源,加锁时获得该资源,将mutex减到0,表示不再有可用资源,解锁时释放该资源,将mutex重新加到1,表示又有了一个可用资源. semaphore和mutex类似,表示可用资源的数量,和mutex不同的是这个数量可以大于1. 也就是说,当信号量描述的资源数目是1时,此时的信号量和互斥锁相同. 下面所讲的是POSIX semaphore库函数,这种信号不仅可用于同一进程

【C/C++多线程编程之六】pthread互斥量

多线程编程之线程同步互斥量  Pthread是 POSIX threads 的简称,是POSIX的线程标准. Pthread线程同步指多个线程协调地,有序地同步使用共享资源.[C/C++多线程编程之五]pthread线程深入理解中讲述到,多线程共享进程资源,一个线程访问共享资源需要一段完整地时间才能完成其读写操作,如果在这段时间内被其他线程打断,就会产生各种不可预知的错误.协调线程按一定的规则,不受打扰地访问共享资源,保证正确性,这便是线程同步的出发点.        互斥量,是最简单的线程同步

POSIX信号量与互斥锁

POSIX信号量相关函数: sem_open sem_close sem_unlink sem_init sem_destroy sem_wait sem_post POSIX互斥锁 pthread_mutex_init pthreaad_mutex_lock pthread_mutex_unlock pthread_mutex_destroy 自旋锁 自旋锁类似于互斥锁,它的性能比互斥锁更高. 自旋锁与互斥锁很重要的一个区别在于,线程在申请自旋锁的时候,线程不会被挂起,它处于忙等待的状态. p