gpt4 book ai didi

c - 如何同步访问数组的索引

转载 作者:太空宇宙 更新时间:2023-11-04 01:16:56 24 4
gpt4 key购买 nike

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

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

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

最佳答案

有几个选项,其中:

选项1

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

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

选项 2

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

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

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

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

关于c - 如何同步访问数组的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56101936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com