pthread互斥锁到底锁定了什么?

时间:2012-02-22 03:55:31

标签: pthreads mutex parallel-processing

我假设这里已被问过,但我找不到这个特别的问题。它只是在锁定和解锁之间锁定代码的一部分,还是锁定全局变量?喜欢这段代码

pthread_mutex_lock(&mtx);
bitmap[index] = 1;
pthread_mutex_unlock(&mtx);

互斥锁只是锁定了那行代码?有没有办法锁定特定变量而不只是锁定使用它们的代码部分?

2 个答案:

答案 0 :(得分:5)

不,它会锁定实际的互斥变量。

在锁定该互斥锁时尝试锁定该互斥锁的任何代码都会阻塞,直到它被解锁。

如果这是锁定互斥锁的唯一代码,那么,是的,你可以说它只是保护那条线。但事实并非如此。

互斥锁用于序列化对资源的访问。无论该资源是被视为一行代码还是(在这种情况下更可能),bitmap数组都会被锁定和解锁互斥锁。

您可能会在几个不同的区域中读取或修改bitmap数组,并且您应该确保它们全部受互斥锁保护。

答案 1 :(得分:3)

没有办法只锁定变量。

Mutex只是一种抽象。因此,无论何时您希望某个变量在使用它时都不会受到影响,请为该变量声明一个互斥锁,并根据需要将其锁定。

互斥锁与要锁定的变量之间没有直接关系。它取决于程序员。最常见的是它用于多线程环境。

每当变量(资源。在编程中,资源在变量中被操纵)在并行运行的进程之间共享时(根据内核,同一进程的线程是一组共享相同地址空间和一些资源的进程),如果程序员想要使变量在特定时间只被访问一个进程,他必须在互斥锁对(pthread_mutex_lock和pthread_mutex_unlock)之间的所有进程(或线程)中编写访问变量的代码块。因此,无论何时在任何进程(或线程)中访问变量,都将锁定互斥锁。因此,如果另一个进程想要访问变量,则必须等到互斥锁解锁。所以程序员的最终目标就实现了。