C++ Pthread 互斥锁

Posted

技术标签:

【中文标题】C++ Pthread 互斥锁【英文标题】:C++ Pthread Mutex Locking 【发布时间】:2018-08-23 07:40:50 【问题描述】:

我想我有点不确定mutexs 的工作原理。如果 mutex 在某些条件后被锁定,它会只锁定满足相同条件的线程,还是会锁定所有线程,直到 mutex 被解锁?

例如:

if (someBoolean)
    pthread_mutex_lock(& mut);

someFunction();

pthread_mutex_unlock(& mut);

会停止所有线程运行someFunction();,还是只停止那些通过 if 语句的线程?

【问题讨论】:

互斥不是魔法。不调用lock就不会加锁。 检查someBoolean 的锁看起来很可疑,可能导致数据争用,而且并非所有线程都试图锁定互斥锁。 @Mat,我的问题是,在它被锁定后,互斥锁是否只会停止通过相同条件并运行到pthread_mutex_lock(& mut); 语句的线程?或者是否所有线程都会停止,无论它们是否命中pthread_mutex_lock(& mut); 语句。 正如我所说,没有魔法。如果一个线程不调用lock,它就不会加锁,也不会阻塞。 这不是关于互斥锁如何工作的问题,而是关于if 语句如何工作的问题。如果任何线程计算someBoolean,并发现它是true,那么它将执行then 子句(即pthread_mutex_lock(&mut))。如果someBooleanfalse,则线程不会执行then 子句。如果变量与其他线程共享,线程在什么状态下找到someBoolean 的问题可能很难回答。 【参考方案1】:

您需要调用pthread_mutex_lock() 才能锁定线程。如果您在线程 A 中调用 pthread_mutex lock 而不是在线程 B 中调用,则线程 B 不会被锁定(并且您可能已经破坏了代码中互斥的目的,因为它只有在每个线程都遵循相同的锁定协议来保护时才有用你的代码)。

有问题的代码有一些问题概述如下:

if (someBoolean)  //if someBoolean is shared among threads, you need to lock 
                  //access to this variable as well.
    pthread_mutex_lock(& mut);

someFunction(); //now you have some threads calling someFunction() with the lock
                //held, and some calling it without the lock held, which 
                //defeats the purpose of mutual exclusion.

pthread_mutex_unlock(& mut); //If you did not lock the *mut* above, you must not 
                             //attempt to unlock it.

【讨论】:

【参考方案2】:

会停止所有线程运行someFunction();,还是只停止那些通过 if 语句的线程?

只有someBoolean 为真的线程才能获得锁。因此,只有那些线程会被阻止调用someFunction(),而其他人持有相同的锁。

但是,在提供的代码中,所有线程都会在互斥体上调用pthread_mutex_unlock,而不管它们是否真的锁定了它。对于使用默认参数创建的互斥体,这构成 undefined behavior 并且必须修复。

【讨论】:

以上是关于C++ Pthread 互斥锁的主要内容,如果未能解决你的问题,请参考以下文章

带有 pthread 和互斥锁的 OpenCV

互斥锁的示例

为啥 pthread 的条件变量函数需要互斥锁?

如何为一组 pthread 共享互斥锁?

Linux-线程同步之互斥锁

pthread mutex 进程间互斥锁