gpt4 book ai didi

c# - .net 中的锁定行为如何?

转载 作者:行者123 更新时间:2023-11-30 14:44:30 26 4
gpt4 key购买 nike

abstract class Foo
{
private List<Object> container;
private bool update;

Foo Foo()
{
container = new List<object>();
update = false;
}

public abstract Bar CreateBar();

public void BeginUpdate()
{
if (!update)
{
Thread update_thread = new Thread(new ThreadStart(Update));
update_thread.Start();
}
}

private void Update()
{
update = true;
while (update)
{
lock (container)
{
if (...)
container.Add(this.CreateBar());
else
container.Remove(...);
}

Thread.Sleep(1337);
}
}

public void EndUpdate()
{
update = false;
}

public List<Object> Objects
{
get
{
lock (container)
{
return this.container;
}
}
}
}

当 Foo 之外的东西调用 Foo 的对象访问器时,例如,

List<Objects> objects = foo_instance.Objects;
foreach (Object o in objects)
{
Thread.Sleep(31173);
}

锁定将如何发生?运行 Update() 的线程是否必须等到上面的 foreach 完成处理对象列表?我希望这两个可以同时工作,是制作对象深拷贝的唯一解决方案吗?

最佳答案

这段代码的几个问题:

  1. 你没有启动线程
  2. 您可以有一个竞争条件(可能不适用于您的程序),其中多个线程调用 BeginUpdate,都认为更新为假,并且都启动一个线程,现在您有两个线程在运行,可能会相互干扰, 因为你有一个拥有共享数据的现场成员
  3. 锁定属性(property)有什么意义?你不需要它。请注意,由于内部更新,您从属性返回的容器有时会处于不断变化的状态。这意味着调用该属性的外部代码必须在访问其内容之前锁定容器本身。不过,您不需要锁即可返回容器引用。
  4. 如果您依次调用 EndUpdate 和 BeginUpdate,则存在竞争条件,旧线程可能还没有机会退出

我想说的是,在您开始担心锁定什么以及何时锁定之前,您应该修复代码,这样它就不会出现许多其他与线程相关的问题。

关于c# - .net 中的锁定行为如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/326309/

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