136*_*136 2 c multithreading synchronization pthreads
我正在编写两个模拟银行服务的程序。有服务器程序和用户程序。服务器设置多个线程,充当“电子计数器”,读取用户的请求并按他们说的做。
用户的帐户存储在服务器上的数组中,可以根据请求进行访问。我的问题如下:想象线程 A 正在将钱从约翰转移到玛丽亚。如何在交易进行时阻止其他线程访问 John 和 Maria 的帐户?我知道信号量、互斥体和条件变量,但我找不到一种不阻止访问整个数组的方式来使用它们。
编辑:我被告知要创建 N 个互斥锁,其中 N = 帐户数,并使每个互斥锁与一个帐户关联。有没有更好的解决方案来解决这个问题?
有几种选择,其中包括:
为每个帐户提供自己的互斥锁。确保当一个线程想要锁定两个记录(例如用于传输)时,它总是以相同的顺序查看它们——例如最小的数字在前。
然后线程将简单地获取它们需要修改的记录的互斥锁(始终遵守正确的锁定顺序以避免死锁),进行修改,然后释放互斥锁。
滚动您自己的记录级锁。为每个帐户建立一个变量,记录该帐户是否被锁定。这可以在帐户数组内或在单独的数据结构中。使用单个互斥锁来保护对所有锁标志的访问,并使用 CV 来帮助线程等待锁可用。
然后线程以这种模式运行:
选项 2 比选项 1 具有更多的线程争用,因此在实践中并发性可能稍低,但这是仅使用一个互斥锁所涉及的权衡。您可以使用混合解决方案在一定程度上解决这个问题,该解决方案将帐户分成多个组,并在每个组的基础上实施选项 2。