یک برنامهٔ جاوا بنویسید که یک بافر محدود (Producer-Consumer) را با استفاده از Semaphore‌ها و یک mutex پیاده‌سازی کند، به‌طوری که چندین تولیدکننده و مصرف‌کننده به‌صورت همزمان آیتم‌ها را تولید و مصرف کنند.

12.0 بازدید آخرین ویرایش در 201 روز قبل ساعت 03:36

0.0

برای حل این مسئله از کلاس java.util.concurrent.Semaphore استفاده کنید: یک Semaphore برای شمارش جای خالی (initial = ظرفیت بافر)، یک Semaphore برای شمارش آیتم‌های پر (initial = 0) و یک mutex (Semaphore با مقدار 1 یا ReentrantLock) برای محافظت از دسترسی به ساختار بافر. تولیدکننده قبل از افزودن آیتم باید جای خالی را acquire کند، سپس mutex را acquire کرده آیتم را اضافه کند و در نهایت mutex و fullSemaphore را release کند؛ مصرف‌کننده بالعکس عمل می‌کند. نکات: از یک ساختار داده ساده مثل آرایه یا Queue برای بافر استفاده کنید، InterruptedException را مدیریت کنید و مطمئن شوید که release در بلوک finally قرار گیرد تا قفل‌ها در صورت بروز خطا آزاد شوند.

توسط پژوهشگر در 201 روز قبل ساعت 03:36
دسته بندی ها: Java Java for beginner
reyhaneh در 201 روز قبل ساعت 05:53

برای جلوگیری از بن‌بست و فرسایش قفل‌ها، هر بار که به‌طور هم‌زمان از سه سمفور استفاده می‌کنید، acquireها را در بلاک try و_RELEASEها را در بخش finally انجام دهید تا در هر حالت منابع آزاد شوند. به مدیریت InterruptedException توجه کنید و در صورت رخ دادن آن، علامت توقف نخ را با Thread.currentThread().interrupt() دوباره تنظیم کنید تا خاتمه به‌درستی انجام شود. ترتیب دقیق عملیات را رعایت کنید: producer قبل از اضافه کردن آیتم empty.acquire()، mutex.acquire()، افزودن آیتم، mutex.release()، و در نهایت full.release()؛ مصرف‌کننده برعکس این مسیر را دنبال می‌کند. برای نمونه‌سازی، از بافر ساده‌ای مانند ArrayDeque یا آرایه استفاده کنید و مطمئن شوید که مقداردهی اولیه Semaphoreها (empty برابر با ظرفیت بافر، full برابر با 0 و mutex برابر با 1) صحیح است تا همزمانی به‌درستی کار کند.

گزارش

1 پاسخ

جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من

در حال بارگیری...
ورود به حساب کاربری