【发布时间】:2015-02-16 09:05:56
【问题描述】:
最近在电话面试中被问到这个问题
"假设有 3 个长度相同的数组列表 l1、l2 和 l3。 三个线程访问三个列表。 说 T1 -> l1,T2 ->l2 & T3 ->l3。 它应该按顺序打印第一个元素,然后是第二个列表的第一个元素,然后是第三个列表的第一个元素。 然后是第一个列表的第二个元素,然后是第二个列表的第二个元素,然后是第三个列表的第二个元素。”
我回答说使用 semaphore 可以解决这个问题,但是当我尝试使用 semaphore 时无法得到正确的答案。 我下面的代码有什么问题
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();
}
}
}
【问题讨论】:
-
您的所有线程似乎都在访问您的所有列表——您可能希望将列表设为
show的参数。此外,您可能希望为列表中的每个项目获取/释放信号量,而不是整个列表。 -
线程执行顺序默认是不可预知的。但是,您可以实现自定义 ThreadPool 来控制它。
标签: c# .net multithreading