【问题标题】:Protect fields accessed by several threads concurrently保护多个线程同时访问的字段
【发布时间】:2021-06-24 16:59:37
【问题描述】:

我有一个类示例,其中GetEntityReconfigure 方法可以由多个线程同时执行。

class Store
{
    private int number;
    private string name;
    private Rules rules;
    private Database database;

    public Entity GetEntity(int id)
    {
        Console.WriteLine($"{number} {name}");
        return database.Get(rules, id);
    }

    public void Reconfigure(Config config)
    {
        number = config.Number;
        name = config.Name;
        policy = new Rules { Timeout = config.Timeout };
        database = DatabaseFactory.GetDatabase(config.DatabaseData);
    }
}
class Rules { }
class Database { }
  • 我真的需要将读取/分配操作同步到number / name / rules / database 字段吗?
  • 如果一个线程正在更新对象上的指针,而另一个线程同时读取指针,那么最后一个线程能否读取损坏的数据或面临其他问题?

【问题讨论】:

  • 添加一个锁定对象以确保这一点。
  • 如果Reconfigure 可以随时调用,那么可以,您需要使用一些同步原语。
  • @peter,如果我使用 Interlocked.Exchange(ref database,DatabaseFactory.GetDatabase(config.DatabaseData)),我会在 GetEntity 方法中进行读取操作并在重新配置线程安全中进行分配操作还是仅分配操作?
  • @tki 这只是故事的一方面。在您的GetEntity 中,您需要致电Interlocked.CompareAndExchange(ref database, null, null); 以获取最新版本。如果您不熟悉同步原语,请至少阅读这些文章(12)。

标签: c# concurrency synchronization


【解决方案1】:

是的,在这种情况下需要同步。否则,读取操作可能会看到配置损坏/损坏,即新旧配置值的混合。此外,两个并发写入操作可能会导致配置长期损坏(直到下一次写入操作)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 2012-05-26
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多