信号量---例子营业厅

用到的关键代码

sem_t sem;//信号量
int sem_init(sem_t *sem,int pshared,unsigned,int value);//初始化由sem指向的信号量,设置它的共享选项,并给它一个初始的整数值。pshared控制信号量的类型,如果其值为0,就表示这个信号量是当前进程的局部信号量,否则信号量就可以在多个进程之间共享。value为sem的初始值。
int sem_wait(sem_t *sem);//信号量减一
int sem_post(sem_t *sem);//信号量加一
int sem_destroy(sem_t *sem);//对信号量进行清理

例子--营业厅

#include "pch.h"
#include<stdio.h>
#include <pthread.h>
#include <windows.h>
#include <iostream>
#include <semaphore.h>
#pragma comment(lib, "pthreadVC2.lib")

#define CUSTOMER_NUM 10
using namespace std;

/*信号量---营业厅*/
sem_t sem;

void *get_service(void *thread_id)
{
	int custor_id = *((int *)thread_id);
	if (sem_wait(&sem) == 0) 
	{
		Sleep(1000);
		printf("customer %d receive service ...\n", custor_id);
		sem_post(&sem);
	}
	return 0;
}

int main(int argc, char *argv[])
{
	sem_init(&sem, 0, 2);
	pthread_t cunstomer[CUSTOMER_NUM];
	int i, iRet;
	for (i = 0; i < CUSTOMER_NUM; i++)
	{
		int customer_id = i;
		iRet = pthread_create(&cunstomer[i], NULL, get_service, &customer_id);
		if (iRet)
		{
			printf("pthread_create is error.");
			return iRet;
		}
		else
			printf("Customer %d arrived.\n", i);
		Sleep(300);
	}
	int j;
	for (j = 0; j < CUSTOMER_NUM; j++)
	{
		pthread_join(cunstomer[j], NULL);
	}
	sem_destroy(&sem);
	return 0;
}

/*信号量---营业厅*/