【发布时间】:2023-03-18 02:08:01
【问题描述】:
我是多线程的新手,我很难理解互斥。
这是 pthread_mutex_lock 的原型
int pthread_mutex_lock(pthread_mutex_t *mutex);
手册页说The mutex object referenced by mutex shall be locked by calling pthread_mutex_lock().
首先我的理解是,您使用互斥锁来锁定共享资源,以便任何时候只有一个线程可以访问它。为了便于讨论,假设共享资源是一个名为myVariable 的全局变量。现在如果我们想锁定 myVariable,我应该可以使用锁定机制锁定myVariable,但锁定mutex object 是什么意思?我的意思是如果我打电话给pthread_mutex_lock(&someMutex),我是锁定myVariable 还是别的什么?
总而言之,如果我想使用互斥,我不应该做类似pthread_mutex_lock(myVariable) 的事情而不是做pthread_mutex_lock(&someMutex) 吗?
另外,这个someMutex 对象如何对应于myVariable?这个someMutex对象如何锁定对myVariable的访问?
附:假设我已经在自己之前声明了someMutex。
附言我有一种感觉,这个问题可能很宽泛,但话又说回来,这不应该是因为我问的是实际上有特定答案的东西(如果我错了,请纠正我)。
【问题讨论】:
-
Mutex 最初被描述为像孩子们的游戏,“Button Button, who got the Button”。如果您有按钮,则仅允许您“触摸”“共享资源”...... Mutex 是按钮,当您的 pthread_mutex_lock() 成功时,您将获得它(逻辑上)。然后,您可以“读取”或“修改”共享资源。完成后,您“解锁”互斥锁,使其可用于其他线程。注意:这是一个简单的/初学者/不完整的描述,但它应该让你开始。
-
哦,那么在这种情况下,我可以说使用相同的互斥锁来锁定不同的变量吗?假设我可以调用 pthread_mutex_lock(&someMutex) 来锁定 myVariable 和 yourVariable 吗?由于互斥锁不是特定于特定变量(或您所说的资源),我应该能够使用单个互斥锁来处理程序中的所有内容,对吧?
-
例如,您可以有一个互斥锁控制对所有全局变量的所有访问...您必须考虑所有线程可能需要访问受互斥锁保护的共享资源的频率...它是您需要多少互斥锁以及它们将锁定什么的设计决策。
-
互斥锁不锁定共享资源,它们锁定部分代码。程序员有责任确保任何共享资源只被相应互斥锁锁定的代码段触及。
标签: c multithreading pthreads mutex