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

时间:2019-05-12 17:54:41

标签: c multithreading synchronization pthreads

我正在编写两个模拟银行服务的程序。有服务器程序和用户程序。服务器设置了多个线程,这些线程充当“电子计数器”,可读取用户的请求并按其要求进行操作。

用户帐户存储在阵列中的服务器上,可以根据请求进行访问。我的问题如下:假设线程A正在将钱从John转移到Maria。在交易进行期间,如何阻止其他线程访问John和Maria的帐户?我了解信号量,互斥量和条件变量,但是我找不到一种不会妨碍访问整个数组的方式来使用它们。

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

1 个答案:

答案 0 :(得分:4)

有几种选择,其中:

选项1

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

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

选项2

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

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

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

与选项1相比,选项2具有更多的线程争用,因此在实践中并发性可能会稍差一些,但这就是仅使用一个互斥锁的权衡。您可以使用混合解决方案在某种程度上解决该问题,该解决方案将帐户划分为组,并在每个组的基础上实施选项2。