如何同步访问数组的索引
How to synchronize access to an index of an array
我正在编写两个模拟银行服务的程序。有服务器程序和用户程序。服务器设置多个线程作为"eletronic counters"读取用户的请求并按照他们说的去做。
用户的帐户存储在服务器上的一个数组中,可以根据请求访问它们。我的问题如下:想象线程 A 正在将钱从约翰转移到玛丽亚。在交易进行时,如何阻止其他线程访问 John 和 Maria 的帐户?我知道信号量、互斥锁和条件变量,但我找不到一种不阻塞对整个数组的访问的方式来使用它们。
编辑:有人告诉我创建 N 个互斥体,其中 N = 帐户数,并让每个互斥体与一个帐户相关联。有没有更好的办法解决这个问题?
有几个选项,其中:
选项 1
为每个帐户提供自己的互斥锁。确保当一个线程想要锁定两个记录时(例如为了传输)它总是以相同的顺序查看它们——例如最小的数字在前。
然后线程将简单地获取它们需要修改的记录的互斥量(始终遵守正确的锁定顺序以避免死锁),进行修改,然后释放互斥量。
选项 2
自己卷 record-level 锁。为每个账户建立一个变量,记录该账户是否被锁定。这可以在帐户数组内或在单独的数据结构中。使用单个互斥体来保护对所有锁标志的访问,并使用 CV 来帮助线程等待锁变得可用。
线程然后以这种模式运行:
- 锁定互斥量。
- 如果所有需要的记录都已解锁,则打开它们的锁定标志并转到第 4 步。
- 等待简历,然后返回第 2 步。
- 释放互斥量
- 执行所有(其他)帐户修改
- Re-lock互斥体
- 关闭步骤2中获取的所有记录锁。
- 广播到 CV 并释放互斥量。
选项 2 比选项 1 有更多的线程争用,因此实际上并发性可能稍低,但这是仅使用一个互斥锁所涉及的权衡。您可以通过混合解决方案在某种程度上解决这个问题,该解决方案将帐户分成几组,并在 per-group 的基础上实施选项 2。
我正在编写两个模拟银行服务的程序。有服务器程序和用户程序。服务器设置多个线程作为"eletronic counters"读取用户的请求并按照他们说的去做。
用户的帐户存储在服务器上的一个数组中,可以根据请求访问它们。我的问题如下:想象线程 A 正在将钱从约翰转移到玛丽亚。在交易进行时,如何阻止其他线程访问 John 和 Maria 的帐户?我知道信号量、互斥锁和条件变量,但我找不到一种不阻塞对整个数组的访问的方式来使用它们。
编辑:有人告诉我创建 N 个互斥体,其中 N = 帐户数,并让每个互斥体与一个帐户相关联。有没有更好的办法解决这个问题?
有几个选项,其中:
选项 1
为每个帐户提供自己的互斥锁。确保当一个线程想要锁定两个记录时(例如为了传输)它总是以相同的顺序查看它们——例如最小的数字在前。
然后线程将简单地获取它们需要修改的记录的互斥量(始终遵守正确的锁定顺序以避免死锁),进行修改,然后释放互斥量。
选项 2
自己卷 record-level 锁。为每个账户建立一个变量,记录该账户是否被锁定。这可以在帐户数组内或在单独的数据结构中。使用单个互斥体来保护对所有锁标志的访问,并使用 CV 来帮助线程等待锁变得可用。
线程然后以这种模式运行:
- 锁定互斥量。
- 如果所有需要的记录都已解锁,则打开它们的锁定标志并转到第 4 步。
- 等待简历,然后返回第 2 步。
- 释放互斥量
- 执行所有(其他)帐户修改
- Re-lock互斥体
- 关闭步骤2中获取的所有记录锁。
- 广播到 CV 并释放互斥量。
选项 2 比选项 1 有更多的线程争用,因此实际上并发性可能稍低,但这是仅使用一个互斥锁所涉及的权衡。您可以通过混合解决方案在某种程度上解决这个问题,该解决方案将帐户分成几组,并在 per-group 的基础上实施选项 2。