我正在编写两个模拟银行服务的程序。有服务器程序和用户程序。服务器设置了多个线程,这些线程充当“电子计数器”,可读取用户的请求并按其要求进行操作。
用户帐户存储在阵列中的服务器上,可以根据请求进行访问。我的问题如下:假设线程A正在将钱从John转移到Maria。在交易进行期间,如何阻止其他线程访问John和Maria的帐户?我了解信号量,互斥量和条件变量,但是我找不到一种不会妨碍访问整个数组的方式来使用它们。
编辑:我被告知要创建N个互斥锁,其中N =帐户数,并将每个互斥锁与一个帐户关联。有更好的解决方案来解决这个问题吗?
答案 0 :(得分:4)
有几种选择,其中:
为每个帐户提供自己的互斥量。确保当线程想要锁定两个记录(例如用于传输)时,它始终以相同的顺序查找它们-例如最低的数字在前。
然后,线程将简单地获取需要修改的记录的互斥锁(始终遵守正确的锁定顺序以避免死锁),进行修改,然后释放互斥锁。
滚动您自己的记录级锁定。为每个帐户建立一个变量,以记录该帐户是否被锁定。它可以在帐户数组内部,也可以在单独的数据结构中。使用单个互斥锁来保护对所有锁定标志的访问,并使用CV来帮助线程等待锁定变为可用。
线程然后以这种模式运行:
与选项1相比,选项2具有更多的线程争用,因此在实践中并发性可能会稍差一些,但这就是仅使用一个互斥锁的权衡。您可以使用混合解决方案在某种程度上解决该问题,该解决方案将帐户划分为组,并在每个组的基础上实施选项2。