gpt4 book ai didi

c# - 同步访问多个线程可以访问的对象

转载 作者:行者123 更新时间:2023-12-03 13:22:31 26 4
gpt4 key购买 nike

我的问题部分受埃里克·利珀特(Eric Lippert)撰写的这篇文章的启发:
http://blogs.msdn.com/ericlippert/archive/2009/10/19/what-is-this-thing-you-call-thread-safe.aspx

使用Eric的Queue类示例,该示例可以被多个线程访问。如果我有两个截然不同的代码来访问队列:

class MyThreadTest {
private static Object myThreadLock = new Object();

void MyDequeue() {
Object myLock = new Object();
lock (myLock) {
if (!queue.IsEmpty()) { queue.DeQueue(); }
}
}

Object MyPeek() {
lock (myThreadLock) {
if (!queue.IsEmpty()) { return queue.Peek(); }
}
}

}

大约在同一时间访问MyDequeue()的两个线程是否会尊重该锁,而一个线程比另一个线程先获得该锁?还是因为在本地作用域中声明了这两个线程,所以每个线程都有不同的锁对象?如果是后者,将myLock对象声明为静态成员是否可以解决此问题?

如果在MyDequeue中使用的是myThreadLock而不是本地的myLock,则两个线程(一个访问MyDequeue,另一个访问MyPeek)是否尊重静态myThreadLock?

我不确定很多,但是我想知道该锁是否锁定了一段代码,或者该锁是否锁定了对象,以便使用该锁的所有代码段都被“打开”和“关闭”。

如果上面的代码中还有其他细微之处,请指出,因为我对这个过程非常幼稚。

最佳答案

所提供的代码是错误的。锁定局部变量(myLock)总是无济于事。
DeQueue()也需要使用myThreadLock,是的,这意味着它正在与Peek()竞争访问权限。而且应该,队列上的所有操作都应使用相同的对象进行锁定。

关于c# - 同步访问多个线程可以访问的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1603628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com