gpt4 book ai didi

c# - 我如何有效地支持项目级和集合级锁定?

转载 作者:太空狗 更新时间:2023-10-29 23:29:13 25 4
gpt4 key购买 nike

我有一个应用程序有一个领域对象的集合,需要实时更新。多个线程可以采取行动修改项目这个集合,必须安全地进行。目前的做法比较简单化,在进行任何更改之前基本上采用全局锁定。或多或少类似于以下内容:

private readonly object lockObject = new object();
private Dictionary<int, Widget> items;

private void UpdateAllWidgets()
{
lock (this.lockObject)
{
// Update all the widgets. No widgets should be permitted to be
// updated while this is running.
}
}

private void UpdateWidget(int widgetId)
{
lock (this.lockObject)
{
// Update the widget with id = widgetId. I want to me able to
// update other widgets at the same time, however.
}
}

我现在遇到了性能问题,因为锁太粗糙了。我希望能够在单个项目被锁定时进行项目级锁定更新(允许其他项目同时更新),但仍然能够必要时使用集合级锁。所以行为看起来像以下内容:

Thread 1: UpdateWidget(1);
Thread 2: UpdateWidget(2); // This can run before UpdateWidget(1)
// completes.

Thread 1: UpdateWidget(1);
Thread 2: UpdateAllWidgets(); // This has to wait for UpdateWidget(1)
Thread 3: UpdateWidget(2); // This has to wait for UpdateAllWidgets()
Thread 4: UpdateWidget(3); // This has to wait for UpdateAllWidgets(), but
// not UpdateWidget(2)

关于支持这个的锁结构有什么想法吗?上面的例子是需要一个简化版本,但我们已经排除了ConcurrentDictionary 一直不够用。采取的行动,例如,UpdateWidget,不仅仅是简单的就地更新。它们可能涉及影响该项目的数据库更新等。

最佳答案

我假设您已经对这种多线程行为与将所有工作编码到单个线程进行了基准测试,以此作为我的回答的前缀。如果没有,请这样做——您可能会发现完全避免锁争用要快得多。

你要找的是读写锁,大概是ReaderWriterLockSlim在 .net 中。要更新单个项目,take a read lock ,然后 lock() 项目,进行更新,然后释放 lock() 和读取锁。要执行“所有项目”更新、添加或删除,take a write lock ,这将是排他性的。

关于c# - 我如何有效地支持项目级和集合级锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40307211/

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