2010-08-13 19 views
7

कैसे धागे एक दूसरे के साथ संवाद करते हैं? वे एक दूसरे के मूल्यों का उपयोग नहीं करते हैं, तो उनके बीच संचार का तरीका क्या है?कैसे धागे एक दूसरे के साथ संवाद करते हैं?

+0

जवाब पहले ही दिया के अलावा, एक नि: शुल्क ई बुक सी # में कैसे सूत्रण कार्यों के लिए काफी बारे में गहराई से परिचय देने के लिए यहाँ की जाँच : [सी # थ्रेडिंग पर मुफ्त ई-बुक] (http://www.albahari.com/threading/) – duesouth

उत्तर

1

थ्रेड मूल्य साझा कर सकते हैं, ऐसा करने पर उन्हें सावधान रहना होगा। .Net में सबसे आम तरीके lock कथन और इंटरलाक्ड क्लास हैं।

4

"वे एक-दूसरे के मूल्यों का उपयोग नहीं करते हैं" - एक ही प्रक्रिया में अच्छी तरह से दो धागे सामान्य चर देख सकते हैं, इसलिए यह सिमुलेशन अपरोक है। इसलिए हम परिस्थितियों की प्रतीक्षा करने और प्रतीक्षा धागे उठने के लिए विभिन्न सिंक्रनाइज़ेशन, लॉकिंग, म्यूटिस और सेम्पहोरेस का उपयोग करते हैं।

जावा में आप सिंक्रनाइज़ेशन जैसे विभिन्न प्राइमेटिव का उपयोग करते हैं। आप इसे tutorial

+0

+1 मुझे समझ में नहीं आता कि इस तथ्य पर विचार क्यों नहीं किया जाता है। पूर्णता के लिए – Luca

5

पढ़ सकते हैं कुछ तरीके थ्रेड एक-दूसरे के साथ संवाद कर सकते हैं। यह सूची संपूर्ण नहीं है, लेकिन इसमें सबसे अधिक उपयोग की जाने वाली रणनीतियों को शामिल किया गया है।

  • साझा स्मृति, एक चर या कुछ अन्य डेटा संरचना की तरह
  • तुल्यकालन पुरातन, ताले और sempahores तरह
  • घटनाक्रम, ManualResetEvent या AutoResetEvent

साझा स्मृति की तरह

public static void Main() 
{ 
    string text = "Hello World"; 
    var thread = new Thread(
    () => 
    { 
     Console.WriteLine(text); // variable read by worker thread 
    }); 
    thread.Start(); 
    Console.WriteLine(text); // variable read by main thread 
} 

तुल्यकालन पुरातन

public static void Main() 
{ 
    var lockObj = new Object(); 
    int x = 0; 
    var thread = new Thread(
    () => 
    { 
     while (true) 
     { 
     lock (lockObj) // blocks until main thread releases the lock 
     { 
      x++; 
     } 
     } 
    }); 
    thread.Start(); 
    while (true) 
    { 
    lock (lockObj) // blocks until worker thread releases the lock 
    { 
     x++; 
     Console.WriteLine(x); 
    } 
    } 
} 

घटनाक्रम

public static void Main() 
{ 
    var are = new AutoResetEvent(false); 
    var thread = new Thread(
    () => 
    { 
     while (true) 
     { 
     Thread.Sleep(1000); 
     are.Set(); // worker thread signals the event 
     } 
    }); 
    thread.Start(); 
    while (are.WaitOne()) // main thread waits for the event to be signaled 
    { 
    Console.WriteLine(DateTime.Now); 
    } 
} 
+1

+1। –

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