C 如何为一组pthread共享互斥锁?
我正在尝试使用pthread做一些事情并同步它们:C 如何为一组pthread共享互斥锁?,c,unix,synchronization,pthreads,mutex,C,Unix,Synchronization,Pthreads,Mutex,我正在尝试使用pthread做一些事情并同步它们: 如何仅对一组线程使用互斥锁? 假设我有t0,t1,t2。。t20。pthreads同时运行,我想为偶数线程设置一个锁,为奇数线程设置另一个锁。。。或者前十个锁一把,其余的锁一把,或者每个锁一把。我的意思是,根据pthread的数据对pthread进行分组(此函数中的第四个参数: int pthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*start_例程)(void*),void
如何仅对一组线程使用互斥锁?
假设我有t0,t1,t2。。t20。pthreads同时运行,我想为偶数线程设置一个锁,为奇数线程设置另一个锁。。。或者前十个锁一把,其余的锁一把,或者每个锁一把。我的意思是,根据pthread的数据对pthread进行分组(此函数中的第四个参数: int pthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*start_例程)(void*),void*arg) 以及为一组pthread共享互斥锁 我正在从事一种银行项目,我想锁定所有试图访问同一账号的PHREAD。(作为关键部门CRUD操作)
这有意义吗?还是有更好的方法来实现这一点?
提前感谢您的帮助和时间;)
J.互斥信号并不意味着要绑定到特定的线程,而是要保护特定的资源 在您的情况下,该资源是银行帐户。我不相信每个帐户互斥解决方案是可行的,特别是如果你的银行有数以千万计的客户,就像一些中国客户那样:-) 一种更可行的方法可能是在内存中保存当前正在处理的帐户列表,并使用单个utex来保护该列表。然后操作将锁定互斥锁,检查并可能修改列表,然后解锁互斥锁 您正在寻找的更好的方法是使用ACID类型的备份存储(如数据库),以确保所有更新都是原子的。由您决定哪些线程共享给定的互斥锁。如果希望互斥体仅由偶数线程共享,那么您所要做的就是确保互斥体仅由偶数线程访问
话虽如此,使用互斥体的正确方法通常是将它与给定的数据集相关联,而不是与特定的代码集相关联。在您的帐号情况下,您可以为每个帐户对象创建一个互斥对象,并确保访问帐户的任何线程首先锁定相应的互斥对象(并在完成时解锁)。通常您不锁定线程-您锁定数据结构,其中,任何/所有想要访问该数据结构的线程都必须获取该数据结构的互斥锁 对于您的情况,这意味着每个银行帐户有一个互斥 下一个问题是,有些东西需要访问多个数据结构。例如,将100美元从一个帐户转移到另一个帐户(您希望锁定两个帐户,然后减少第一个帐户的余额,增加第二个帐户的余额,然后释放两个锁定)。这可能导致死锁。例如,如果一个线程想要锁定A然后锁定B,而另一个线程想要锁定B然后锁定A;然后第一个线程可能会锁定A,第二个线程可能会锁定B,然后两个线程都无法获得所需的第二个锁 该问题的解决方案是拥有一个全局“锁顺序”,并且只按该顺序获取锁
对于你的情况,你有帐号。如果一个线程想要锁定2个或多个帐户,那么它将确定哪些帐户,然后对帐户列表进行排序(例如,从最低的帐户编号到最高的帐户编号),然后按照该顺序获取它需要的所有锁。一旦线程获得了它所需要的所有锁,它将执行它必须执行的任何操作,然后以相反的顺序释放它所获得的所有锁。+1用于建议支持ACID的后备存储。帐户列表和单个互斥锁并非没有额外的工作。您需要学习条件变量,以避免忙于等待帐户解锁。您好@paxdiablo,谢谢您的回答。你是说所有账户都有一份清单?因此互斥锁将保护该列表,任何操作都必须在继续之前检查该列表。。但是如果我希望线程同时在不同的帐户上工作,这是帐户的一个列表呢?@jcosta,您在处理帐户时不锁定互斥锁,而是在处理列表时锁定互斥锁。示例:一个线程希望在帐户#7上工作。它锁定列表,然后检查以确保没有其他人在处理它。如果其他人是,它将解锁互斥锁和错误。否则,它将声明该帐户的所有权(针对该帐户存储其线程ID),解锁互斥锁并开始工作。一旦完成,它将锁定、移除所有权并解锁。互斥锁仅在列表本身更新期间保持,因此不同的线程可以在不同的帐户上工作。@paxdiablo:它不是“如果其他人[使用该帐户],而是解锁互斥锁并出现“您可能想要的”错误,直到帐户可用,请等待条件变量”(每当线程放弃帐户所有权时,都会发出条件变量的信号)。谢谢你们。我将尝试这些方法。@caf当你说wait时,是指
pthread\u cond\u wait()吗
?锁定和解锁互斥锁的线程也会控制该条件,不是吗?或者该条件适用于其他线程?再次感谢。你好@Brendan,谢谢,是的,你使用锁定顺序来防止死锁是正确的。我会这样做。但是如何实现每个银行帐户一个互斥锁?我的意思是,互斥锁是一个变量:pthread_mutex_t
线程间共享..那么你的意思是每个帐户添加一个变量?(如果这是一个noob问题,很抱歉)谢谢@caf,明白了,但是如何实现每个银行帐户一个互斥?我的意思是,互斥是一个变量:pthread_mutex_t线程间共享..那么你的意思是每个帐户添加一个变量?(如果是noob问题,再次抱歉)@jcosta:是-例如,如果您已经有一个表示单个银行帐户的struct
,您可以在该struct
中添加pthread\u mutex\u t
。您需要使用pthread\u mutex\u init()对其进行初始化