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

📄 test_clone.c

📁 操作系统课程设计 有进程同步问题 内存管理 设备管理
💻 C
字号:
#include "sched.h"
#include "pthread.h"
#include "stdio.h"
#include "stdlib.h"
#include "semaphore.h"

int producer(void * args);
int consumer(void *args);
pthread_mutex_t mutex;
sem_t product;
sem_t warehouse;

char buffer[8][4];
int buffer_pointer=0;

main(int argc,char** argv)
{
  pthread_mutex_init(&mutex,NULL);
  sem_init(&product,0,0);
  sem_init(&warehouse,0,8);
  int clone_flag,arg,retval;
  char *stack;
  clone_flag = CLONE_VM|CLONE_SIGHAND|CLONE_FS|CLONE_FILES;
  int i;
  for(i=0;i<2;i++){  //创建四个线程
     arg = i;
stack =(char*)malloc(4096); 
 retval = clone((void*)producer,&(stack[4095]),clone_flag,(void*)&arg);
stack =(char*)malloc(4096); 
      retval = clone((void*)consumer,&(stack[4095]),clone_flag,(void*)&arg);
  }
  exit(1);
}

int producer(void* args)
{
  int id = *((int*)args);
  int i;
  for(i=0;i<10;i++){
	  sleep(i+1);  //表现线程速度差别
     sem_wait(&warehouse);
     pthread_mutex_lock(&mutex);
     if(id==0)
         strcpy(buffer[buffer_pointer], "aaa\0");
     else
       strcpy(buffer[buffer_pointer], "bbb\0");
     buffer_pointer++;
     printf("producer%d produce %s in %d\n",id,buffer[buffer_pointer-1],buffer_pointer-1);
     pthread_mutex_unlock(&mutex);
     sem_post(&product);
  }
  printf("producer%d is over!\n",id);
}

int consumer(void *args)
{
  int id = *((int*)args);
  int i;
  for(i=0;i<10;i++){
     sleep(10-i);  //表现线程速度差别
     sem_wait(&product);
     pthread_mutex_lock(&mutex);
     buffer_pointer--;
     printf("consumer%d get %s in %d\n",id,buffer[buffer_pointer],buffer_pointer);
     strcpy(buffer[buffer_pointer],"zzz\0");
     pthread_mutex_unlock(&mutex);
     sem_post(&warehouse);
  }
  printf("consumer%d is over!\n",id);
}

⌨️ 快捷键说明

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