好的。我想让两个线程运行。当前代码:
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/