如何为一组线程共享互斥锁



我正在尝试用pthreads做一些事情并同步它们:
我怎么能在一组线程中使用互斥锁?
假设我有t0 t1 t2…t20。pthreads同时运行,我想有一个锁为偶数线程和其他锁为奇数线程…或者前10个锁一个,其余的锁一个,或者每个锁一个。我的意思是,根据pthread的数据(该函数的第四个参数:

)对pthread进行分组。

int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);

和共享一组pthread的互斥锁

我正在做一个银行项目,我想锁定所有试图访问同一个账号的人。(作为关键区CRUD操作)
这有意义吗?或者有更好的方法来做到这一点?
提前感谢您的帮助和时间;)

j .

互斥信号量不是用来绑定到特定线程的,它们是用来保护特定的资源的。

在您的示例中,该资源是银行帐户。我不相信每个账户互斥的解决方案是可行的,特别是如果你的银行有数千万客户,就像一些中国银行那样:-)

更可行的方法可能是在内存中保存当前正在处理的帐户列表,并使用单个 utex来保护它。这些操作将锁定互斥锁,检查并可能修改列表,然后解锁互斥锁。

您正在寻找的更好的方法是使用acid类型的后备存储(如数据库)来确保所有更新都是原子的。

决定哪些线程共享给定的互斥锁。如果你想要一个互斥锁只被偶数个线程共享,那么你所要做的就是确保这个互斥锁只被偶数个线程访问。

话虽如此,使用互斥锁的正确方法通常是将它与一组给定的数据相关联,而不是与一组特定的代码相关联。对于您的帐号,您可以为每个帐户对象创建一个互斥锁,并确保访问帐户的任何线程首先锁定相应的互斥锁(并在完成后解锁)。

通常不锁线程,而是锁数据结构,任何/所有想要访问该数据结构的线程都必须获取该数据结构的互斥锁。

对于您的例子,这意味着每个银行帐户有一个互斥锁。

下一个问题是,有些东西需要访问多个数据结构。这方面的一个例子是将100美元从一个帐户转移到另一个帐户(您希望锁定两个帐户,然后减少第一个帐户的余额,增加第二个帐户的余额,然后释放两个锁)。这可能导致死锁。例如,如果一个线程想先锁A再锁B,另一个线程想先锁B再锁A;那么第一个线程可能锁定A,第二个线程可能锁定B,然后两个线程都无法获得它们需要的第二个锁。

这个问题的解决方案是有一个全局的"锁顺序",并且只按照这个顺序获取锁。

对于您的案例,您有帐号。如果一个线程想要锁定2个或更多的帐户,那么它决定哪些帐户,然后对帐户列表进行排序(例如,从最低的帐户编号到最高的帐户编号),然后按照该顺序获得所需的所有锁。一旦线程获得了它所需要的所有锁,它就会做它必须做的事情,然后以相反的顺序释放它所获得的所有锁。

最新更新