हाल ही में मैं इस सवाल का एक फोन साक्षात्कारकैसे प्रत्येक थ्रेड क्रमिक रूप से सूची में तत्वों का उपयोग करने के
में पूछा गया था "कहें 3 सरणी एल 1, एल 2 एक ही लंबाई के & L3। तीन धागे तीन सूचियों तक पहुँचने को सूचीबद्ध कर रहे हैं। कहें टी 1 -> एल 1, टी 2 -> एल 2 & टी 3 -> एल 3। यह क्रम में प्रिंट करना चाहिए कि पहले सूची के पहले तत्व के पहले तत्व के पहले तत्व और फिर तीसरी सूची का पहला तत्व। फिर 1 का दूसरा तत्व दूसरी सूची का तत्व और फिर तीसरी सूची का दूसरा तत्व। "
मैंने जवाब दिया कि सेमफोर का उपयोग करके इस समस्या को हल कर सकते हैं, लेकिन जब मैंने सेमाफोर के साथ खुद को कोशिश की तो उचित जवाब नहीं मिला। मेरे नीचे कोड
namespace Semaphore_Example
{
class Program
{
static List<int> list1 = new List<int>{ 1, 2, 3, 4, 5 };
static List<int> list2 = new List<int> { 1, 2, 3, 4, 5 };
static List<int> list3 = new List<int> { 1, 2, 3, 4, 5 };
static Semaphore semaphore = new Semaphore(0,3);
static SemaphoreSlim _sem = new SemaphoreSlim(3);
static void Main(string[] args)
{
Thread t1 = new Thread(show);
Thread t2 = new Thread(show);
Thread t3 = new Thread(show);
t1.Start();
t2.Start();
t3.Start();
Console.ReadLine();
}
static void show()
{
_sem.Wait();
for (int i = 0; i < 5; i++)
{
Console.WriteLine(list1[i]);
Console.WriteLine(list2[i]);
Console.WriteLine(list3[i]);
}
_sem.Release();
}
}
}
आपके सभी धागे आपकी सभी सूचियों का आकलन कर रहे हैं - शायद आप सूची को 'शो' का पैरामीटर बनाना चाहते हैं। साथ ही आप शायद सूची में प्रत्येक आइटम के लिए सेमफोर लेना/रिलीज़ करना चाहते हैं, न कि पूरी तरह से सूची के लिए। –
थ्रेड निष्पादन आदेश डिफ़ॉल्ट रूप से अप्रत्याशित है। हालांकि, आप इसे नियंत्रित करने के लिए एक कस्टम थ्रेडपूल लागू कर सकते हैं। – rducom