www.pudn.com > LFYOS.zip > sem.c


/*test result is 4.46us*/ 
#include 
#include 
#include 
#include 
#include 
#include 
#define KEY 12345 
#define NUMBER 100 
#define THREAD_NUMBER 2048 
 
int s_id; 
 
void init() 
{ 
	union semun { 
		int val; 
		struct semid_ds *buf; 
		ushort arry[1]; 
	}arg; 
	s_id=semget(KEY,2,0666|IPC_CREAT); 
	if(s_id<0) 
		{printf("get fail ");exit(0);} 
	arg.val=0; 
	if(semctl(s_id,0,SETVAL,arg.val)<0) 
		{printf("control 0 fail ");exit(0);} 
	arg.val=0; 
	if(semctl(s_id,1,SETVAL,arg.val)<0) 
		{printf("control 1 fail ");exit(0);} 
	return; 
} 
 
void p0(int n) 
{ 
	struct sembuf sbuf; 
	sbuf.sem_num=0; 
	sbuf.sem_op=0-n; 
	sbuf.sem_flg=0; 
	if(semop(s_id,&sbuf,1)<0) 
		{printf("p0 fail");exit(0);}; 
	return; 
} 
 
void p1(int n) 
{ 
	struct sembuf sbuf; 
	sbuf.sem_num=1; 
	sbuf.sem_op=0-n; 
	sbuf.sem_flg=0; 
	if(semop(s_id,&sbuf,1)<0) 
		{printf("p0 fail");exit(0);}; 
	return; 
} 
	 
void v0(int n) 
{ 
	struct sembuf sbuf; 
	sbuf.sem_num=0; 
	sbuf.sem_op=n; 
	sbuf.sem_flg=0; 
	if(semop(s_id,&sbuf,1)<0) 
		{printf("V0 fail");exit(0);}; 
	return; 
} 
 
void v1(int n) 
{ 
	struct sembuf sbuf; 
	sbuf.sem_num=0; 
	sbuf.sem_op=n; 
	sbuf.sem_flg=0; 
	if(semop(s_id,&sbuf,1)<0) 
		{printf("V0 fail");exit(0);}; 
	return; 
} 
 
void f0() 
{ 
	int i,j,t,x; 
	t=time(&x); 
	for(i=0;i