硬件互斥算法的SWAP实现

#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);
}
Related Posts

文章归档

近期文章

近期评论

    分类目录

    2024年7月
    « 10月    
    1234567
    891011121314
    15161718192021
    22232425262728
    293031