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

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

编辑:有人告诉我创建N个互斥锁,其中N =帐户数,并让每个互斥锁与一个帐户关联。是否有更好的解决方案来解决此问题?

最佳答案

有几种选择,其中:

选项1

给每个帐户自己的互斥量。确保当线程想要锁定两个记录(例如用于传输)时,它始终以相同的顺序查找它们-例如最低编号优先。

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

选项2

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

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

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


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

    10-08 04:05