如何停止资源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执行
    if(Program.semaphore!=1)
    并看到它不是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行,但几乎没有用。在这种特定情况下,它们可以工作。如果您想要滚动不需要标准同步原语的内容,请阅读。但通常您应该使用我通常建议的一些标准作为多线程的完整资源