C# 多线程

标签 c# multithreading locks

好的。我想让两个线程运行。当前代码:

    public void foo()
    {      
            lock(this)
            {
                while (stopThreads == false)
                {
                   foreach (var acc in myList)
                   {
                     // process some stuff
                   }
                 }
             }
     }

    public void bar()
    {      
            lock(this)
            {
                while (stopThreads == false)
                {
                   foreach (var acc in myList)
                   {
                     // process some stuff
                   }
                 }
             }
     }

两者都访问同一个列表,问题是第一个线程“foo”没有释放我猜的锁;因为“bar”仅在“foo”完成后才开始。谢谢

最佳答案

是的,这就是锁的设计原理。

The lock keyword marks a statement block as a critical section by obtaining the mutual-exclusion lock for a given object, executing a statement, and then releasing the lock.

互斥是指任一时刻最多只能有一个线程持有锁。

锁定这一点是一个坏主意,不鼓励这样做。您应该创建一个私有(private)对象并锁定它。要解决您的问题,您可以锁定两个不同的对象。

private object lockObject1 = new object();
private object lockObject2 = new object();

public void foo()
{      
    lock (lockObject1)
    {
         // ...
    }
}

public void bar()
{      
    lock (lockObject2)
    {
         // ...
    }
}

或者,您可以重复使用相同的锁,但将其移到循环内,以便每个循环都有机会继续:

while (stopThreads == false)
{
   foreach (var acc in myList)
   {
       lock (lockObject)
       {
           // process some stuff
       }
   }
}

但是,我建议您花一些时间来了解正在发生的事情,而不是重新排序代码行,直到它看起来可以在您的计算机上运行。编写正确的多线程代码很困难。

要停止线程,我会推荐这篇文章:

关于C# 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3793542/

相关文章:

C# 服务器端确认 ASP.NET 中的对话

multithreading - 自定义线程行为不当

c# - Monitor.Wait 和 "exitContext"参数

multithreading - Delphi XE 中的多线程有哪些新功能?

java - java缓存中的锁策略

c# - 在 WPF Canvas 上的给定点居中文本

c# - 使用 C# 按创建日期降序获取目录中的文件列表

c# - 加载项 (MAF) : Running in Separate process

c# - 多线程文件访问(加锁控制)

java - 可重入锁对象锁定