Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何为一组pthread共享互斥锁?_C_Unix_Synchronization_Pthreads_Mutex - Fatal编程技术网

C 如何为一组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

我正在尝试使用pthread做一些事情并同步它们:
如何仅对一组线程使用互斥锁?
假设我有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()对其进行初始化