#include <sched.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> #define THREADS 8 /*定义进程互斥变量,初始为0; 当mutex==0,表示临界区空闲; 当mutex==1,表示临界区被占; */ volatile int mutex=0;int sharedvar=0; volatile int wait[THREADS]; void EnterControl(int i){/*当前线程为第i个线程*/ int newVal=1; int oldVal=0; wait[i]=1; /*量值设置为1,表示进程准备进入临界区*/ /*如果oldVal==0 and mutex==1,则临界区被占,等待;*/ /*如果oldVal==0 and mutex==0,表示临界区空闲,则 */ /* 用newVal的值赋给mutex,当前线程可以进入临界区*/ /*该指令返回mutex变量的值*/ while(wait[i] && ____sync_val_compare_and_swap(&mutex,oldVal,newVal)) continue; wait[i]=0; printf("No%d entered the CR(%d#-%d)\n",i,getpid(),mutex); } void ExitControl(int i) { int j; j=(i+1) % THREADS; while(j!=i && !wait[j]) j=(j+1)%THREADS; if(j==i) __sync_lock_release(&mutex);//mutex=0; else wait[j]=0; printf("\t\tNo%d quit the CR(%d#-%d)\n",i,getpid(),mutex); } int AccessSharedV(void *args) { int id=*((int *)args); int i; for(i=0;i<10;i++){ if(i<4) sleep(id+1); else sleep(i); EnterControl(id); sharedvar=sharedvar+id+1; printf("\tsharedvar=%d,thread id=%d\n",sharedvar,getpid()); ExitControl(id); } } main() { int i,clone_flag,arg,retval; char *stack; clone_flag=CLONE_VM|CLONE_SIGHAND|CLONE_FS|CLONE_FILES; for(i=0;i<THREADS;i++){ wait[i]=0; arg=i; stack=(char *)malloc(4096); retval=clone((void *)AccessSharedV,&(stack[4095]),clone_flag,(void*)&arg); } exit(0); }
Leave Your Comment Here