如何停止资源c#
使用两个线程打印列表中的数字。但很少有数字重复。我用信号灯锁定了不起作用的东西。我做错什么了吗 ? 需要帮助如何停止资源c#,c#,multithreading,C#,Multithreading,使用两个线程打印列表中的数字。但很少有数字重复。我用信号灯锁定了不起作用的东西。我做错什么了吗 ? 需要帮助 class Program { public static int count=0; public static List<string> numbers = new List<string>(); public static int semaphore=0; static void Main(string[] args)
class Program
{
public static int count=0;
public static List<string> numbers = new List<string>();
public static int semaphore=0;
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
numbers.Add(i.ToString());
}
Console.WriteLine("Before start thread");
Thread tid1 = new Thread(new ThreadStart(MyThread.Thread1));
Thread tid2 = new Thread(new ThreadStart(MyThread.Thread1));
tid1.Start();
tid2.Start();
}
}
public class MyThread
{
public static void Thread1()
{
for (; Program.count < Program.numbers.Count;)
{
if (Program.semaphore != 1)
{
Program.semaphore = 1;
Console.WriteLine(Program.numbers[Program.count]);
Program.count++;
Program.semaphore = 0;
}
}
}
}
类程序
{
公共静态整数计数=0;
公共静态列表编号=新列表();
公共静态int信号量=0;
静态void Main(字符串[]参数)
{
对于(int i=0;i<10;i++)
{
添加(i.ToString());
}
Console.WriteLine(“启动线程前”);
线程tid1=新线程(新线程开始(MyThread.Thread1));
线程tid2=新线程(新线程开始(MyThread.Thread1));
tid1.Start();
tid2.Start();
}
}
公共类神话阅读
{
公共静态无效线程1()
{
对于(;Program.count
您有一个竞争条件:
- 线程1执行
并看到它不是1if(Program.semaphore!=1)
- 同时,线程2还执行if(Program.semaphore!=1)并发现它不是1
- 因此,两个线程都进入
的主体if
锁
:
public class MyThread
{
public static object locker = new object();
public static void Thread1()
{
for (; Program.count < Program.numbers.Count;)
{
lock (locker)
{
if (Program.count < Program.numbers.Count)
{
Console.WriteLine(Program.numbers[Program.count]);
Program.count++;
}
}
}
}
}
公共类读取
{
公共静态对象锁定器=新对象();
公共静态无效线程1()
{
对于(;Program.count
请注意,以下幼稚的解决方案仍然具有竞争条件,并且将不起作用:
public class MyThread
{
public static object locker = new object();
public static void Thread1()
{
for (; Program.count < Program.numbers.Count;)
{
lock (locker)
{
Console.WriteLine(Program.numbers[Program.count]);
Program.count++;
}
}
}
}
公共类读取
{
公共静态对象锁定器=新对象();
公共静态无效线程1()
{
对于(;Program.count
这是因为
for
循环中的检查是在锁之外进行的,因此程序.count
可能是在for
循环中进行的检查和输入的锁之间的另一个线程增加的。您的信号量不是a,而是Int32
。它甚至不是易变的,即使它是易变的,由于检查和设置之间的竞争,它也不会有帮助。我如何解决它?@phpnet最好的解决方案是从阅读一些关于多线程和锁定的文章开始。我们可以给你写5行,但几乎没有用。在这种特定情况下,它们可以工作。如果您想要滚动不需要标准同步原语的内容,请阅读。但通常您应该使用我通常建议的一些标准作为多线程的完整资源