funjoke
Member level 3
Write a C program that accepts 3 parameters. Each parameter indicates the quantity of product to be
produced. Each product will be produced in different production line. Ready products will be placed
in a buffer area located at the end of each production line. Packaging workers will pack the products
into boxes. Information of each production line as follow:
Production line A: product ready in 1-2 minutes, buffer capacity: 12 units
Production line B: product ready in 2-3 minutes, buffer capacity: 6 units
Production line C: product ready in 1-2 minutes, buffer capacity: 24 units
There are currently 2 packaging workers available. Each worker needs 2 minutes to pack 6 units of
product into a box. The production line will be temporary suspended if the buffer area is full of
product. The operation will continue when the worker has taken 1 unit of product from the buffer
area.
Simulate the operation of production line and the packaging workers by using threads and
appropriate semaphores. There are at least 5 threads, but you may use additional thread if it is
necessary. You have to decide how the workers select the product to pack. Assume that 1 second in
your program is equivalent to 1 minute.
Sample output:
...
Buffer A: 11
Buffer C: 4
Worker X packing B: 3
Buffer B: 8
Worker Y packing C: 2
Buffer A: 12
Production line A suspended.
...
#here is the code i attach with ...pls help on
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
void *A(void *arg);
void *B(void *arg);
void *C(void *arg);
int main(){
int res, total=0;
pthread_t b_thread, e_thread, s_thread;
void *thread_result;
res = sem_init(&A,B,C 0, 0);
if(res != 0){
perror("Semaphore initialization failed");
exit(EXIT_FAILURE);
}
//create the thread that prepares A
res = pthread_create(&b_thread, A,NULL);
if(res != 0){
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
//create the thread that prepares B
res = pthread_create(&s_thread, NULL, B, NULL);
if(res != 0){
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
//create the thread that prepares C
res = pthread_create(&s_thread, NULL, C, NULL);
if(res != 0){
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
and(getpid());
while(total <12){
sleep(rand()%3 + 1);
sem_post(&A);
printf("A ready\n");
total++;
}
printf("\nWaiting for thread to finish...\n");
res = pthread_join(b_thread, &thread_result);
if(res != 0){
perror("Thread join failed");
exit(EXIT_FAILURE);
}
printf("Thread joined\n");
res = pthread_join(s_thread, &thread_result);
if(res != 0){
perror("Thread join failed");
exit(EXIT_FAILURE);
}
printf("Thread joined\n");
sem_destroy(&B);
exit(EXIT_SUCCESS);
}
void *A(void *arg){
int i;
srand(time(NULL));
for(i=0; i<7; i++){
sem_wait(&B);
sleep(rand()%4+1);
printf("A prepared.\n");
}
pthread_exit(NULL);
}
void *B(void *arg){
int i;
srand(time(NULL));
for(i=0; i<5; i++){
sem_wait(&A);
sleep(rand()%3+1);
printf("B prepared.\n");
}
pthread_exit(NULL);
}
void *C(void *arg){
int i;
srand(time(NULL));
for(i=0; i<5; i++){
sem_wait(&A);
sleep(rand()%3+1);
printf("C prepared.\n");
}
pthread_exit(NULL);
}
produced. Each product will be produced in different production line. Ready products will be placed
in a buffer area located at the end of each production line. Packaging workers will pack the products
into boxes. Information of each production line as follow:
Production line A: product ready in 1-2 minutes, buffer capacity: 12 units
Production line B: product ready in 2-3 minutes, buffer capacity: 6 units
Production line C: product ready in 1-2 minutes, buffer capacity: 24 units
There are currently 2 packaging workers available. Each worker needs 2 minutes to pack 6 units of
product into a box. The production line will be temporary suspended if the buffer area is full of
product. The operation will continue when the worker has taken 1 unit of product from the buffer
area.
Simulate the operation of production line and the packaging workers by using threads and
appropriate semaphores. There are at least 5 threads, but you may use additional thread if it is
necessary. You have to decide how the workers select the product to pack. Assume that 1 second in
your program is equivalent to 1 minute.
Sample output:
...
Buffer A: 11
Buffer C: 4
Worker X packing B: 3
Buffer B: 8
Worker Y packing C: 2
Buffer A: 12
Production line A suspended.
...
#here is the code i attach with ...pls help on
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
void *A(void *arg);
void *B(void *arg);
void *C(void *arg);
int main(){
int res, total=0;
pthread_t b_thread, e_thread, s_thread;
void *thread_result;
res = sem_init(&A,B,C 0, 0);
if(res != 0){
perror("Semaphore initialization failed");
exit(EXIT_FAILURE);
}
//create the thread that prepares A
res = pthread_create(&b_thread, A,NULL);
if(res != 0){
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
//create the thread that prepares B
res = pthread_create(&s_thread, NULL, B, NULL);
if(res != 0){
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
//create the thread that prepares C
res = pthread_create(&s_thread, NULL, C, NULL);
if(res != 0){
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
and(getpid());
while(total <12){
sleep(rand()%3 + 1);
sem_post(&A);
printf("A ready\n");
total++;
}
printf("\nWaiting for thread to finish...\n");
res = pthread_join(b_thread, &thread_result);
if(res != 0){
perror("Thread join failed");
exit(EXIT_FAILURE);
}
printf("Thread joined\n");
res = pthread_join(s_thread, &thread_result);
if(res != 0){
perror("Thread join failed");
exit(EXIT_FAILURE);
}
printf("Thread joined\n");
sem_destroy(&B);
exit(EXIT_SUCCESS);
}
void *A(void *arg){
int i;
srand(time(NULL));
for(i=0; i<7; i++){
sem_wait(&B);
sleep(rand()%4+1);
printf("A prepared.\n");
}
pthread_exit(NULL);
}
void *B(void *arg){
int i;
srand(time(NULL));
for(i=0; i<5; i++){
sem_wait(&A);
sleep(rand()%3+1);
printf("B prepared.\n");
}
pthread_exit(NULL);
}
void *C(void *arg){
int i;
srand(time(NULL));
for(i=0; i<5; i++){
sem_wait(&A);
sleep(rand()%3+1);
printf("C prepared.\n");
}
pthread_exit(NULL);
}