سؤال

أنا أتدرب حاليًا لامتحان نظام التشغيل مع التكرارات السابقة وقد عثرت على ما يلي:

تنفيذ "حاجز عملية" ، أي ، التأكد من أن كل عملية من مجموعة منهم تنتظر ، في مرحلة ما من تنفيذها ، للعمليات الأخرى للوصول إلى نقطة معينة.

لديك OPS التالية متاحة:

init(sem,value), wait(sem) and signal(sem)

N هو رقم تعسفي.يمكنني أن أجعله يعمل لعدد معين من العمليات، ولكن ليس لأي عدد.

أيه أفكار؟لا بأس في الرد بالرمز الزائف، فهذه ليست مهمة، إنها مجرد دراسة شخصية.

هل كانت مفيدة؟

المحلول

يتم تقديم هذا بشكل جيد في كتاب الإشارات الصغيرة.

n = the number of threads
count = 0
mutex = Semaphore(1)
barrier = Semaphore(0)


mutex.wait()
count = count + 1
mutex.signal()

if count == n: barrier.signal() # unblock ONE thread

barrier.wait()
barrier.signal() # once we are unblocked, it's our duty to unblock the next thread

نصائح أخرى

باستخدام الإشارات N.لست متأكدا جدا ...

semaphore barr[N]
semaphore excl=1
int count=0

int i=1
while (i<=N)
   barr[i]=0 #initialization
   i=i+1

# use, each thread (tid)
wait(excl)
count=count+1
if (count==N)
   int j=1
   while (j<=N)
       signal(barr[j])
       j=j+1
   count=0
signal(excl)
wait(barr[tid])

فقط 2 إشارات حاجزة، ولكن غير متأكد ...

semaphore barr[0..1] # two semaphores: barr[0] and barr[1]
semaphore excl=1
int count=0
int whichOne=0 # select semaphore to avoid race conditions

barr[0]=0 #initialization
barr[1]=0

# sample use
int current   #local for each thread
wait(excl)
current=whichOne
count=count+1
if (count==N)
   int j=1
   while (j<=N)
       signal(barr[current])
       j=j+1
   count=0
   whichOne=1-whichOne # swap barrier to avoid race conditions
signal(excl)
wait(barr[current])
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top