Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <pthread.h>
- #include <stdlib.h>
- #include <semaphore.h>
- #define OPERATOR_NUM 1
- #define CUSTOMER_NUM 1
- static struct{
- sem_t line_lock;
- int line_number;
- sem_t customers[CUSTOMER_NUM];
- sem_t oper_line_lock;
- int curr_customer;
- sem_t customer_ready;
- } line_oper;
- static struct{
- sem_t line_lock;
- int line_number;
- sem_t customers[CUSTOMER_NUM];
- sem_t customer_ready;
- } line_cashier;
- void * Cashier_FN(void * data){
- int i=0;
- for(; i<CUSTOMER_NUM; i++){
- sem_wait(&line_cashier.customer_ready);
- printf("cashier done queue %d\n", i);
- sem_post(&line_cashier.customers[i]);
- }
- }
- void * Operator_FN(void * data){
- int oper = *(int *)data;
- printf("%d\n", oper);
- int curr_customer;
- while(1){
- sem_wait(&line_oper.customer_ready);
- sem_wait(&line_oper.oper_line_lock);
- curr_customer = line_oper.curr_customer++;
- sem_post(&line_oper.oper_line_lock);
- printf("operator %d done with queue %d\n", oper, curr_customer);
- sem_post(&line_oper.customers[curr_customer]);
- if(curr_customer == CUSTOMER_NUM)break;
- }
- }
- void * CUSTOMER_FN(void * data){
- int order;
- sem_wait(&line_oper.line_lock);
- order = line_oper.line_number;
- line_oper.line_number ++;
- printf("customer %d took queue number %d\n", *(int *)data,order);
- sem_post(&line_oper.line_lock);
- sem_post(&line_oper.customer_ready);
- sem_wait(&line_oper.customers[order]);
- sem_wait(&line_cashier.line_lock);
- order = line_cashier.line_number++;
- printf("customer %d took queue for cashier%d\n",*(int *)data, order);
- sem_post(&line_cashier.line_lock);
- sem_post(&line_cashier.customer_ready);
- sem_wait(&line_cashier.customers[order]);
- }
- void init_setup(){
- sem_init(&line_oper.line_lock, 0, 1);
- line_oper.line_number = 0;
- int i=0;
- for(; i<CUSTOMER_NUM; i++){
- sem_init(&line_oper.customers[i], 0, 0);
- }
- sem_init(&line_oper.oper_line_lock, 0, 1);
- line_oper.curr_customer = 0;
- sem_init(&line_oper.customer_ready, 0, 0);
- sem_init(&line_cashier.line_lock, 0, 1);
- line_cashier.line_number = 0;
- i=0;
- for(; i<CUSTOMER_NUM; i++){
- sem_init(&line_cashier.customers[i], 0, 0);
- }
- line_oper.curr_customer = 0;
- sem_init(&line_cashier.customer_ready, 0, 0);
- }
- int main(){
- init_setup();
- pthread_t cashier;
- pthread_create(&cashier, NULL, Cashier_FN, NULL);
- pthread_t t[OPERATOR_NUM];
- pthread_t tx[CUSTOMER_NUM];
- int i=0;
- for(; i<OPERATOR_NUM; i++){
- int x = i+1;
- pthread_create(&t[i], NULL, Operator_FN, &x);
- }
- i=0;
- for(; i<CUSTOMER_NUM; i++){
- int x = i+1;
- pthread_create(&tx[i], NULL, CUSTOMER_FN, &x);
- }
- for(i=0; i<CUSTOMER_NUM; i++){
- pthread_join(tx[i], NULL);
- }
- for(i=0; i<OPERATOR_NUM; i++){
- pthread_join(t[i], NULL);
- }
- pthread_join(cashier, NULL);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement