سؤال

ويمكن الإشارة تكون أقل من 0؟ أعني، ويقول لدي إشارة مع N = 3 وأدعو "القاعدة" 4 مرات، ثم N ستبقى 0 ولكن سيتم حظر عملية واحدة؟

ونفس وسيلة أخرى، وإذا كان في البداية كنت استدعاء، يمكن أن يكون N أعلى من 3؟ لأنه كما أراه، إذا N يمكن أن يكون أعلى من 3 إذا كان في البداية كنت استدعاء عدة مرات، ثم في وقت لاحق أنا يمكن أن نسميه أسفل مرات أكثر مما أستطيع، مما يضع المزيد من العمليات في مقطع حرج ثم الإشارة تسمح لي .

إذا شخص ما من شأنه توضيح ذلك قليلا بالنسبة لي وسوف نقدر كثيرا.

وجريج

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

المحلول

والدعوة إلى أسفل عندما تصبح النتيجة 0 يجب أن لا تعمل. استدعاء عندما يكون 3 يعمل. (إنني أفكر في جاوة).

واسمحوا لي أن أضيف بعض أكثر. كثير من الناس يعتقدون أقفال مثل الإشارات (الثنائية) (أي - N = 1، وبالتالي فإن قيمة إشارة إما 0 (عقد) أو 1 (لم تجر)). ولكن هذا ليس صحيحا تماما. وقفل لديه مفهوم "الملكية" لذلك قد يكون "عودة الدخول". وهذا يعني أن الخيط الذي يحمل قفل، وسمح له بأن يتصل القفل () مرة أخرى (التحرك الفعال لعدد من 0 إلى -1)، وذلك لأن موضوع يحمل بالفعل القفل والسماح لل"إعادة إدخال" عليه. أقفال يمكن أيضا أن تكون غير عودة الدخول. ومن المتوقع أن تدعو فتح () نفس العدد من المرات كما القفل () حامل القفل.

وأعمدة الإشارة ليس لديهم فكرة الملكية، لذلك لا يمكن أن تكون عودة الدخول، على الرغم من أن العديد من التصاريح أن تتوفر يمكن الحصول عليها. هذا يعني موضوع يحتاج لمنع عندما يواجه قيمة 0، حتى بزيادة شخص الإشارة.

وأيضا، في ما شاهدته (والذي هو جافا)، يمكنك زيادة الإشارة أكبر من N، والتي أيضا نوع من له علاقة الملكية: لسيمافور ليس لديه فكرة الملكية حتى أي شخص يمكن أن تعطيه المزيد من التصاريح . وخلافا للموضوع، حيث كلما اطلاق العنان لدعوات موضوع () دون عقد التأمين، وهذا هو خطأ. (في جافا فإنه سيتم رمي استثناء).

ونأمل أن يكون هذا وسيلة للتفكير في أن يساعد.

نصائح أخرى

و(استخدام المصطلحات من java.util.concurrent.Semaphore تعطى علامة جافا، وبعض هذه التفاصيل تنفيذ محددة. وأظن بك "القاعدة" هو طريقة acquire() الإشارة جاوة، والخاص "حتى" هو release(). )

نعم، آخر مكالمة لacquire() سوف يمنع حتى يدعو موضوع آخر release() أو انقطع الخيط الخاص بك.

نعم، يمكنك الاتصال release() أكثر من مرة، ثم انخفض أكثر من مرة - على الأقل مع java.util.concurrent.Semaphore

قد يكون بعض التطبيقات الأخرى للإشارة إلى فكرة "الأقصى" عدد تصاريح، ودعوة إلى إطلاق سراح أبعد من ذلك الحد الأقصى ستفشل. الطبقة Semaphore جافا يسمح الوضع العكسي، حيث يمكن الإشارة تبدأ مع عدد السلبي للتصاريح، وجميع المكالمات acquire() ستفشل حتى كانت هناك دعوات release() كافية. وبمجرد أن عدد تصاريح أصبح غير سلبي، وسوف تصبح أبدا السلبي مرة أخرى.

ومرحبا جريج النظر في المثال التالي:

public static void main(String [] args) throws InterruptedException {

        Semaphore available = new Semaphore(1, true);

        available.acquire();
        System.out.println("Acquire : " +available.availablePermits());

        available.release();
        System.out.println("Released : " +available.availablePermits());

        available.release();
        System.out.println("Released : " +available.availablePermits());

        available.release();
        System.out.println("Released : " +available.availablePermits());

        available.release();
        System.out.println("Released : " +available.availablePermits());

        available.acquire();
        System.out.println("Acquire : " +available.availablePermits());

        available.acquire();
        System.out.println("Acquire : " +available.availablePermits());

        available.acquire();
        System.out.println("Acquire : " +available.availablePermits());

        available.acquire();
        System.out.println("Acquire : " +available.availablePermits());

        available.acquire();
        System.out.println("Acquire : " +available.availablePermits());
    }

إذا كنت ترى إخراج سيحصل u التالية:

Acquire : 0
Released : 1
Released : 2
Released : 3
Released : 4
Acquire : 3
Acquire : 2
Acquire : 1
Acquire : 0

وانتظر يجري.

وهكذا تسمح أساسا سيزيد على كل إصدار واكتساب وخفضه حتى 0. مرة واحدة وصلت 0 سوف الانتظار حتى يتم استدعاء الإصدار على نفس الكائن :)

نعم، قيمة سالبة يعني لديك العمليات تنتظر الإشارة إلى أن أفرج عنه. قيمة موجبة يعني أنك يمكن أن نطلق الحصول على تلك عدة مرات من قبل الكتل الإشارة.

هل يمكن التفكير في القيمة في هذه الطريقة: رقم موجب يعني هناك أن العديد من الموارد المتاحة. القيمة السالبة تعني أن هناك العديد من الجهات التي تحتاج إلى مورد عندما تؤخذ جميع الموارد في الوقت الراهن. عند الحصول على المورد الذي إنقاص قيمة، عند الإفراج عنها قمت بزيادة القيمة. إذا كانت القيمة لا يزال> = 0 بعد إنقاص تحصل على الموارد، وإلا يتم وضع الكيان الخاص بك إلى قائمة الانتظار.

وثمة تفسير لطيفة من الإشارات في ويكيبيديا: http://en.wikipedia.org/wiki/Semaphore_(programming)

وانظر فقط N كما العداد التي تهم الموارد المحدود. لأنك لا يمكن أن يكون رقما سالبا للموارد، N يبقى> = 0. وإذا كان عدد من التغييرات الموارد المتاحة لديك، وإلى تغيير الحد الأقصى لN، أيضا. I wouln't تنظر فيه اسلوب جيد لزيادة ن دون decrementing لأول مرة في أي حالة أخرى.

وعن طريق java.util.concurrent.Semaphore مع أساليب acquire() وrelease()، وأعتقد سوف يكون دائما >=0 تصاريح. دعونا نقول لكم تريد مزامنة المواضيع بحيث فقط 1 موضوع يمكن أن يكون داخل لحلقة. إذا ووزارة شؤون المرأة هو نوع من Semaphore التي لديها القيمة الأولية 1، هذا لن يعمل لأكثر من 2 المواضيع.

while(true){            

    sem.wait(); // wait is acquire

    for(int i=0; i<=5; i++){

        try {
            Thread.sleep(250);
        }catch (InterruptedException e) {}

        System.out.println("Thread "+ threadname+ " " + i);

             }
    sem.signal(); // signal is release }

ومع ذلك، يمكنك تنفيذ الطبقة سيمافور من جافا وجعل الفئة الخاصة بك التي تسمح بذلك.

package yourpackage;

import java.util.concurrent.Semaphore;

public class SemaphoreLayer {
public Semaphore s=null;
public String name;
private int val;

public SemaphoreLayer(int i){
    s=new Semaphore(i); val=i;
}

public void wait(){
 try {
     val--;
     s.acquire();

  } catch (InterruptedException e) {
    System.out.println("Error signal semaphorelayer");
}}

public void signal(){
    if(val<0){val++;}{
        s.release();
        val++;
    }
}

}

والآن فال يمكن أن يكون سلبيا. ومع ذلك، وأنا لست متأكدا من أن هذا هو آمنة تماما، لأنه إذا كان لدينا إشارة من موضوع واحد وننتظر من الطرف الآخر ويحاولون val++ وval-- هذا يمكن أن يكون سيئا. (لذلك هي صغيرة جدا ولكن لا يزال خارج وجدت، لذلك إذا كنت الترميز وعليك أن تكون 100٪ أي خطأ، وأنا لا أنصح باستخدام هذا الرمز) وفي الختام هذا هو السبب في أنه من الأفضل استخدام مفهوم المراقبين في جافا وكلمة رئيسية متزامنة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top