در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

کار با threadها در لینوکس - قسمت چهارم

6. پیاده سازی مسئله کلاسیک تولید کننده-مصرف کننده


در زیر کد مسئله تولید کننده-مصرف کننده با در نظر گرفتن اندازه بافر 1 آورده شود. برای پیاده سازی این مسئله از سمافور استفاده شده است.

#include "stdlib.h"
#include "stdio.h"
#include "unistd.h"
#include "string.h"
#include "pthread.h"
#include "semaphore.h"

int sharedVar;
sem_t mutex;
sem_t full;
sem_t empty;
int counter;

//	کد مصرف کننده
void *ConvertToBinary(void *args)
{
	while(1){
		sem_wait(&full);
		sem_wait(&mutex);
		printf("thread 2:: converting '%d' to binary ....\n",sharedVar);
		int temp[128];
		int i=-1;
		while(sharedVar!=0){
			i++;
			temp[i]=sharedVar%2;
			sharedVar=sharedVar/2;
		}
		printf("thread 2:: result is: ");
		while(i>=0){
			printf("%d",temp[i]);
			i--;
		}
		printf("\n\n");
		sem_post(&mutex);
		sem_post(&empty);
	}
	pthread_exit(NULL);
}
//	کد تولید کننده
void main(){

	pthread_t thread_id;
	void *thread_result;

	printf("how many numbers do you want to display in their binary formats:");
	scanf("%d",&counter);

	if(sem_init(&mutex,0,1)==0)printf("'mutex' semaphore created\n");
	if(sem_init(&empty,0,1)==0)printf("'empty' semaphore created\n");
	if(sem_init(&full,0,0)==0)printf("'full' semaphore created\n");

	pthread_create(&thread_id,NULL,ConvertToBinary,NULL);
	int i=0;
	for(i=0;i<counter;i++)
	{
		printf("thread 1:: producing a random number (try to acquire semaphore)....\n\n");
		sleep(1);
		srand(time(NULL));
		sem_wait(&empty);
		sem_wait(&mutex);
		sharedVar=rand()%20+1;
		printf("thread 1::(semaphores acquired) rand number is: %d\n",sharedVar);
		sem_post(&mutex);
		sem_post(&full);
	}
	printf("nothing to do with semaphore...\n");
	sem_destroy(&mutex);
	sem_destroy(&full);
	sem_destroy(&empty);
	printf("we destroyed all semaphores");
	exit(1);
}

نمونه اجرای برنامه

 کار با threadها در لینوکس - قسمت چهارم

7. پیاده سازی مسئله کلاسیک نویسنده - خوانندگان


در زیر سورس مسئله نویسنده - خوانندگان آورده شده است. در این برنامه خوانندگان دارای اولویت هستند؛ یعنی تا زمانی که خواننده ای مشغول خواندن از متغیر مشترک است، نویسنده اجازه تغییر در متغیر مشترک را نخواهد داشت. در این برنامه تعداد خوانندگان سه عدد است. برای پیاده سازی این مسئله از قفل های mutex استفاده شده است.

#include "stdlib.h"
#include "stdio.h"
#include "unistd.h"
#include "string.h"
#include "pthread.h"
#include "semaphore.h"

char sharedVar[1024];
pthread_mutex_t rw_mutex;
pthread_mutex_t mutex;
int read_count=0;
//	کد خواننده
void *ReaderFunc(void *args)
{
	while(1)
	{
		pthread_mutex_lock(&mutex);
		read_count++;
		if(read_count==1)
			pthread_mutex_lock(&rw_mutex);
		pthread_mutex_unlock(&mutex);
		printf("%s:: shared variable content==> %s\n",(char*)args,sharedVar);

		pthread_mutex_lock(&mutex);
		read_count--;
		if(read_count==0){
			pthread_mutex_unlock(&rw_mutex);
		}
		pthread_mutex_unlock(&mutex);
		sleep(1);
	}
}
/*==========================================================*/
//	کد نویسنده
void *WriterFunc(void *args)
{
	while(1)
	{
		printf("writer:: producing contents\n");
		int i=0;
		char bf[5];
		for(i=0;i<5;i++)
		{
			while(1)
			{
				sleep(1);
				srand(time(NULL));
				int rnd=rand()%91;
				if(rnd>64 && rnd<91)
				{
					bf[i]=rnd;
					break;	
				}
			}
		}
		printf("writer:: try to acquire lock...\n");
		pthread_mutex_lock(&rw_mutex);
		strcpy(sharedVar,bf);
		printf("writer:: shared variable is edited....\n");
		pthread_mutex_unlock(&rw_mutex);
	}
}
/*==========================================================*/

void main(){

	void *thread_result;
	pthread_t thread_id[3];

	if(pthread_mutex_init(&rw_mutex,NULL)==0)printf("'rw_mutex' has been initialized\n");
	if(pthread_mutex_init(&mutex,NULL)==0)printf("'mutex' has been initialized\n");

	sprintf(sharedVar,"%s","reader_writer problem");
	printf("'shared variable' has been initialized to '%s'\n",sharedVar);

	pthread_create(&thread_id[0],NULL,WriterFunc,NULL);

	pthread_create(&thread_id[1],NULL,ReaderFunc,"reader1");
	pthread_create(&thread_id[2],NULL,ReaderFunc,"reader2");
	pthread_create(&thread_id[3],NULL,ReaderFunc,"reader3");

	pthread_join(thread_id[0],&thread_result);
}

نمونه اجرای برنامه

 کار با threadها در لینوکس - قسمت چهارم


نویسنده : رامین غلامی تقی زاده

منبع : انجمن تخصصی فناوری اطلاعات ایران

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

#قفل_های_mutex #مسائل_کلاسیک_همگام_سازی #سمافورها
عنوان
1 کار با threadها در لینوکس - قسمت اول رایگان
2 کار با threadها در لینوکس - قسمت دوم رایگان
3 کار با threadها در لینوکس - قسمت سوم رایگان
4 کار با threadها در لینوکس - قسمت چهارم رایگان
زمان و قیمت کل 0″ 0
2 نظر
asdf

salam in barnamaro dar obonto dar barnameye Code::Blocks run kardim laken kheyli eror mide ....

رامین تقی زاده

سلام. من این برنامه ها رو با دستور gcc کامپایل میکردم و حین توسعه از IDE خاصی هم استفاده نمی کردم و همین طور که مشاهده میکنید جواب هم گرفتم. اگه چند نمونه از خطاهایی که باهاش مواجه میشی رو بزاری اینجا شاید بهتر بتونم کمکتون کنم.

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره پاییزه می تونی امروز ارزونتر از فردا خرید کنی ....