کد توضیح فرمول تولید آب یا H2O با استفاده از سمافور

این کد پروژه ای در مورد مسئله ی همگام سازی تولید مولکول های آب است.شرح مسئله :اتم های هیدروژن منتظر اتم اکسیژن میمانند تا با هم واکنش داده و مولکول آب را تشکیل دهند.و همینطور یک اتم اکسیژن منتظر میماند تا دو اتم هیدروژن تشکیل شده و آب را به بوجود بیاورند.در آخر نیز مولکول ها تجزیه شده و به اتم های تشکیل دهنده ی آن ها تبدیل شده و باز هم به یکدیگر متصل میشوند و الی آخر...کد این مسئله :

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
#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 سمافور استفاده میکنیم.

  1. oxygenQueue :این سمافور برای منتظر ماندن اکسیژن ها بکار رفته است.
  2. hydroQueue :این سمافور هم مانند قبلی، اما برای هیدروژن هاست.
  3. mutex :قفلی است که باعث میشوداکسیژن ها و یا هیدروژن های مختلف هم زمان با هم ساخته نشوند.
  4. bond_sem :هم زمان مولکول های تشکیل دهنده ی آب مقدار bond را افزایش ندهد.

نظرات