如何同步对数组索引的访问

136*_*136 2 c multithreading synchronization pthreads

我正在编写两个模拟银行服务的程序。有服务器程序和用户程序。服务器设置多个线程,充当“电子计数器”,读取用户的请求并按他们说的做。

用户的帐户存储在服务器上的数组中,可以根据请求进行访问。我的问题如下:想象线程 A 正在将钱从约翰转移到玛丽亚。如何在交易进行时阻止其他线程访问 John 和 Maria 的帐户?我知道信号量、互斥体和条件变量,但我找不到一种不阻止访问整个数组的方式来使用它们。

编辑:我被告知要创建 N 个互斥锁,其中 N = 帐户数,并使每个互斥锁与一个帐户关联。有没有更好的解决方案来解决这个问题?

Joh*_*ger 5

有几种选择,其中包括:

选项1

为每个帐户提供自己的互斥锁。确保当一个线程想要锁定两个记录(例如用于传输)时,它总是以相同的顺序查看它们——例如最小的数字在前。

然后线程将简单地获取它们需要修改的记录的互斥锁(始终遵守正确的锁定顺序以避免死锁),进行修改,然后释放互斥锁。

选项 2

滚动您自己的记录级锁。为每个帐户建立一个变量,记录该帐户是否被锁定。这可以在帐户数组内或在单独的数据结构中。使用单个互斥锁来保护对所有锁标志的访问,并使用 CV 来帮助线程等待锁可用。

然后线程以这种模式运行:

  1. 锁定互斥锁。
  2. 如果所有必需的记录都已解锁,则打开它们的锁定标志并转到步骤 4。
  3. 等待简历,然后返回第 2 步。
  4. 释放互斥锁
  5. 执行所有(其他)帐户修改
  6. 重新锁定互斥锁
  7. 关闭在步骤 2 中获取的所有记录锁。
  8. 广播到 CV 并释放互斥锁。

选项 2 比选项 1 具有更多的线程争用,因此在实践中并发性可能稍低,但这是仅使用一个互斥锁所涉及的权衡。您可以使用混合解决方案在一定程度上解决这个问题,该解决方案将帐户分成多个组,并在每个组的基础上实施选项 2。