کد توضیح فرمول تولید آب یا 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 را افزایش ندهد.

یادگیری برنامه نویسی برای متخصصین حوزه کامپیوتر این روزها یک الزام به حساب می آید. از جمله محبوب ترین زبان های برنامه نویسی دنیا می توانیم به زبان برنامه نویسی سی شارپ ، زبان برنامه نویسی جاوا ، زبان برنامه نویسی پایتون ، زبان برنامه نویسی سی پلاس پلاس و زبان برنامه نویسی SQL ( لازمه هر زبان دیگری ) و زبان برنامه نویسی PHP اشاره کنیم.

برای آموزش برنامه نویسی می توانید با خیال راحت در قالب دوره های آموزش برنامه نویسی سایت توسینسو ، آموزش سی شارپ ، آموزش جاوا ، آموزش پایتون ، آموزش جنگو ، آموزش PHP ،  آموزش جاوا اسکریپت ، آموزش برنامه نویسی اندروید ، آموزش SQL و آموزش MySQL را بصورت جامع و حرفه ای آموزش ببینید.


نظرات