📄 sem.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 + -