Files
2026-06-25 00:09:09 +08:00

75 lines
1.9 KiB
C++

#include "sched.h"
#include "pthread.h"
#include "stdio.h"
#include "stdlib.h"
#include "semaphore.h"
#include <cstring>
#include <unistd.h>
int producer(void *args);
int consumer(void *args);
pthread_mutex_t mutex;
sem_t product;
sem_t warehouse;
char buffer[8][4];
int bp = 0;
int 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((int (*)(void*))producer, stack + 4095, clone_flag, (void *)&arg);
free(stack);
stack = (char *)malloc(4096);
sleep(1);
retval = clone((int (*)(void*))consumer, stack + 4095, clone_flag, (void *)&arg);
free(stack);
}
sleep(30);
exit(0);
}
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[bp], "aaa\0");
else
strcpy(buffer[bp], "bbb\0");
bp++;
printf("producer%d produce %s in %d\n", id, buffer[bp - 1], bp - 1);
pthread_mutex_unlock(&mutex);
sem_post(&product);
}
printf("producer%d is over!\n", id);
return 0;
}
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);
bp--;
printf("consumer%d get %s in %d\n", id, buffer[bp], bp);
strcpy(buffer[bp], "zzz\0");
pthread_mutex_unlock(&mutex);
sem_post(&warehouse);
}
printf("consumer%d is over!\n", id);
return 0;
}