75 lines
1.9 KiB
C++
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;
|
|
} |