2011-03-23 10 views
7

तुलना औरसेट (जावा में) का उपयोग कर लॉक-फ्री कतार से कुछ कोड यहां दिया गया है:क्या ये लाइनें लॉक-फ्री कतार में आवश्यक नहीं हैं?

public void enq(T value) { 
    Node newNode = new Node(value); 
    while(true) { 
     Node last = tail.get(); 
     Node next = last.next.get(); 

     if(last != tail.get()) 
      continue; //???  

     if (next != null) { //improve tail 
      tail.compareAndSet(last, next); 
      continue; 
     } 

     if (last.next.compareAndSet(null, newNode)) { //update last node 
      tail.compareAndSet(last, newNode); //update tail 
      return; 
     } 
    } 
} 

public T deq() throws EmptyException { 
    while(true) { 
     Node first = head.get(); 
     Node last = tail.get(); 
     Node next = first.next.get(); 

     if(first != head.get()) 
      continue; //??? 

     if(first == last) { 
      if (next == null) 
       throw new EmptyException(); 

      tail.compareAndSet(last, next); 
      continue; 
     } 

     T value = next.value; 
     if (head.compareAnsdSet(first, next)) { 
      return value; 
     } 
    } 
} 

(सिर और पूंछ कतार के सदस्य हैं)

दोनों डेक और एनक्यू फ़ंक्शन में, पहला चेक मेरे लिए अनावश्यक लगता है। (जिन लोगों ने "???" के साथ टिप्पणी की) मुझे संदेह है कि यह सिर्फ कुछ प्रकार के अनुकूलन के लिए है।

क्या मुझे यहां कुछ याद आ रही है? क्या ये जांच कोड की शुद्धता को प्रभावित करती हैं?

(कोड "मल्टी प्रोसेसर प्रोग्रामिंग आर्ट" से लिया गया है, हालांकि मैंने कोड शैली को कम घोंसला वाले आईएस और एल्स के लिए दोबारा इस्तेमाल किया है, जबकि कोड को समतुल्य रखते हुए)

+0

वे यह जांचते हुए प्रतीत होते हैं कि स्थानीय चर लगातार सेट किए गए हैं, लेकिन मैं इसे दूसरों के पास छोड़ दूंगा कि वे कोड की शुद्धता को प्रभावित करते हैं या नहीं। –

उत्तर

3

हाँ, जावा में, यह देखते हुए यह कचरा संग्रह है, उन आईएफएस अनुकूलन के रूप में केवल वास्तविक मूल्य है, और यह है थोड़ी सी थोड़ी सी: सीएएस स्मृति से सिर्फ पढ़ने के मुकाबले अविश्वसनीय रूप से महंगा है, इसलिए सुनिश्चित करें कि इस दौरान मूल्य में कोई बदलाव नहीं आया है, और इस प्रकार बाद के सीएएस पर असफल होने का मौका कम हो रहा है, सीएएस-रिट्रीज़ की संख्या को कम करने में मदद करता है , जो प्रदर्शन में मदद करता है।

तुम भी पहले == पिछले & & पूंछ-अपडेट जांच head.CAS अंदर करने के लिए, ले जा सकते हैं एक और अनुकूलन के रूप में:, पूंछ पीछे केवल तभी कर सकते सिर अद्यतन किया गया था तो यह जांच करना कि केवल अगर कैस सफल हो गया समझ में आता है। आप वहां tail.get भी ले जा सकते हैं, क्योंकि आपको कहीं और इसकी आवश्यकता नहीं है। नीचे उदाहरण कोड। उम्मीद है की यह मदद करेगा!

public T deq() throws EmptyException { 
while(true) { 
    Node first = head.get(); 
    Node next = first.next.get(); 

    if (first != head.get()) 
     continue; 

    if (next == null) { 
     throw new EmptyException(); 
    } 

    T value = next.value; 

    if (head.compareAndSet(first, next)) { 
     Node last = tail.get(); 

     if (first == last) { 
      tail.compareAndSet(last, next); 
     } 

     return value; 
    } 
} 

}

+0

अच्छा, मैंने कुछ सीखा। धन्यवाद। – Jaydee

2

(कोड "मल्टी प्रोसेसर प्रोग्रामिंग की कला" से, है, जबकि कोड बराबर रखते हुए लिया जाता है हालांकि मैं कोड शैली refactor कम नेस्टेड आईएफएस के लिए किया था और elses) वे आवश्यक नहीं हैं, लेकिन प्रदर्शन कारणों के लिए उपयोग किया जाता है, ध्यान दें कि चेक परमाणु संचालन के बिना होता है। MSDN से

उदाहरण लागत:

  • MemoryBarrier 20-90 चक्र लेने के रूप में मापा गया था।
  • इंटरलाक्ड इंस्ट्रक्शन को 36-90 चक्र लेने के रूप में मापा गया था।
  • एक महत्वपूर्ण खंड प्राप्त करने या जारी करने के लिए 40-100 चक्र लेने के रूप में मापा गया था।
  • एक म्यूटेक्स प्राप्त करना या जारी करना लगभग 750-2500 चक्र लेने के रूप में मापा गया था। इस विशेष तकनीक के लिए

संदर्भ:

[रूडोल्फ & Segall 84] रूडोल्फ, एल और Segall, जेड उप-Namic विकेन्द्रीकृत कैश योजनाएं समानांतर प्रोसेसर forMIMD। Invù पर कॉम-कंप्यूटर आर्किटेक्चर theíúvúth वार्षिक संगोष्ठी roceedingsof, पृष्ठों 340i> 347, 1984.

0

यह गैर अवरुद्ध लिंक्ड सूची एल्गोरिथ्म है। जेसीपी पुस्तक में एक विस्तृत विवरण है (15.4.2।एक अनब्लॉकिंग लिंक्ड लिस्ट)

संबंधित मुद्दे