⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sem.c

📁 虚地址空间基于文件OS内核源代码和文件
💻 C
字号:
/*test result is 4.46us*/
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<sched.h>
#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<NUMBER;i++){
		for(j=0;j<THREAD_NUMBER;j++)
			p0(1);
		v1(THREAD_NUMBER);
	}
	printf("\ntime length is %d\n",time(&x)-t);
	v1(THREAD_NUMBER);
	exit(0);
}
void f1()
{
	int i,j;
	for(i=0;i<NUMBER;i++)
		{v0(1);p1(1);}
	exit(0);
}
struct{
	char data[1024];
}stack[THREAD_NUMBER];
main()
{
	int i;
	init();
	for(i=0;i<THREAD_NUMBER;i++){
		printf("\n create thread %d,%d",i,
		__clone(f1,&(stack[i].data[1023]),
			CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND
			,NULL));
	}
	printf("\npush any key to continue\n");
	getchar();
	printf("\nbegin\n");
	f0();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -