این کد پروژه ای در مورد مسئله ی همگام سازی تولید مولکول های آب است.شرح مسئله :اتم های هیدروژن منتظر اتم اکسیژن میمانند تا با هم واکنش داده و مولکول آب را تشکیل دهند.و همینطور یک اتم اکسیژن منتظر میماند تا دو اتم هیدروژن تشکیل شده و آب را به بوجود بیاورند.در آخر نیز مولکول ها تجزیه شده و به اتم های تشکیل دهنده ی آن ها تبدیل شده و باز هم به یکدیگر متصل میشوند و الی آخر...کد این مسئله :
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
int b
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(b
{
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]);
b
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 سمافور استفاده میکنیم.
- oxygenQueue :این سمافور برای منتظر ماندن اکسیژن ها بکار رفته است.
- hydroQueue :این سمافور هم مانند قبلی، اما برای هیدروژن هاست.
- mutex :قفلی است که باعث میشوداکسیژن ها و یا هیدروژن های مختلف هم زمان با هم ساخته نشوند.
- bond_sem :هم زمان مولکول های تشکیل دهنده ی آب مقدار bond را افزایش ندهد.
نظرات کاربران (0)