این کد پروژه ای در مورد مسئله ی همگام سازی تولید مولکول های آب است.شرح مسئله :اتم های هیدروژن منتظر اتم اکسیژن میمانند تا با هم واکنش داده و مولکول آب را تشکیل دهند.و همینطور یک اتم اکسیژن منتظر میماند تا دو اتم هیدروژن تشکیل شده و آب را به بوجود بیاورند.در آخر نیز مولکول ها تجزیه شده و به اتم های تشکیل دهنده ی آن ها تبدیل شده و باز هم به یکدیگر متصل میشوند و الی آخر...کد این مسئله :
#include <stdlib.h> #include <stdio.h> #include <pthread.h> #include <semaphore.h> #include <unistd.h> int bond=0; int oxygen=0; int hydrogen=0; sem_t oxygenQueue; sem_t hydroQueue; sem_t mutex; sem_t bond_sem; int a[3]; int co=0; char c[3]; void bondfunc(void) { sem_wait(&bond_sem); bond++; if(bond==3) { printf("the water is maked by %c%d %c%d %c%d \n",c[0],a[0],c[1],a[1],c[2],a[2]); bond=0; co=0; } sem_post(&bond_sem); } void* hidrofunc(void* arg) { sem_wait(&mutex); hydrogen++; if(hydrogen>=2 && oxygen>=1) { sem_post(&hydroQueue); sem_post(&hydroQueue); hydrogen-=2; sem_post(&oxygenQueue); oxygen--; } else { sem_post(&mutex); } sem_wait(&hydroQueue); printf("hydrogen %d maked\n",arg); a[co]=arg; c[co++]='h'; bondfunc(); pthread_exit(0); } void* oxygenfunc(void* arg) { sem_wait(&mutex); oxygen++; if(hydrogen>=2) { sem_post(&hydroQueue); sem_post(&hydroQueue); hydrogen-=2; sem_post(&oxygenQueue); oxygen--; } else { sem_post(&mutex); } sem_wait(&oxygenQueue); printf("oxygen %d maked\n",arg); a[co]=arg; c[co++]='o'; bondfunc(); sem_post(&mutex); pthread_exit(0); } void main() { sem_init(&hydroQueue,0,0); sem_init(&oxygenQueue,0,0); sem_init(&mutex,0,1); sem_init(&bond_sem,0,1); printf("\nmain start\n"); pthread_t oxygen[10]; pthread_t hydrogen[10]; int i=0; char v; while(1){ for(i=0;i<10;i++) { oxygen[i]=pthread_self(); } for(i=0;i<10;i++) { hydrogen[i]=pthread_self(); } for(i=0;i<8;i++) { pthread_create(&hydrogen[i],NULL,hidrofunc,(void*)i); } for(i=0;i<5;i++) { pthread_create(&oxygen[i],NULL,oxygenfunc,(void*) i); } for(i=0;i<8;i++) pthread_join(hydrogen[i],NULL); } sleep(1); pthread_self(); sem_destroy(&hydroQueue); sem_destroy(&oxygenQueue); sem_destroy(&mutex); sem_destroy(&bond_sem); exit(1); }
توضیح کد :در این کد از 4 سمافور استفاده میکنیم.
زمان پاسخ گویی روز های شنبه الی چهارشنبه ساعت 9 الی 18
فقط به موضوعات مربوط به محصولات آموزشی و فروش پاسخ داده می شود