C++ C++;Pthread互斥锁

C++ C++;Pthread互斥锁,c++,multithreading,pthreads,C++,Multithreading,Pthreads,我想我有点不确定互斥是如何工作的。如果一个mutex在某个条件后被锁定,它会只锁定满足相同条件的线程,还是会锁定所有线程,直到mutex被解锁 例: 是否所有线程都将停止运行someFunction(),或者只是那些通过if语句的线程?您需要调用pthread\u mutex\u lock(),以便锁定线程。如果在线程A中调用pthread_mutex lock,而不是在线程B中调用pthread_mutex lock,那么线程B不会被锁定(而且您很可能已经破坏了代码中互斥的目的,因为只有当每个

我想我有点不确定互斥是如何工作的。如果一个
mutex
在某个条件后被锁定,它会只锁定满足相同条件的线程,还是会锁定所有线程,直到
mutex
被解锁

例:


是否所有线程都将停止运行
someFunction()
,或者只是那些通过if语句的线程?

您需要调用
pthread\u mutex\u lock()
,以便锁定线程。如果在线程A中调用pthread_mutex lock,而不是在线程B中调用pthread_mutex lock,那么线程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.

您需要调用
pthread\u mutex\u lock()
才能锁定线程。如果在线程A中调用pthread_mutex lock,而不是在线程B中调用pthread_mutex lock,那么线程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.
是否所有线程都将停止运行
someFunction(),还是仅通过if语句的线程

只有
someBoolean
为true的线程才会获得锁。因此,当其他线程持有相同的锁时,只有这些线程才能被阻止调用
someFunction()

但是,在提供的代码中,所有线程都将调用互斥锁上的
pthread\u mutex\u unlock
,而不管它们是否实际锁定了互斥锁。对于使用默认参数创建的互斥体,这构成并且必须修复

是否所有线程都将停止运行
someFunction(),还是仅通过if语句的线程

只有
someBoolean
为true的线程才会获得锁。因此,当其他线程持有相同的锁时,只有这些线程才能被阻止调用
someFunction()


但是,在提供的代码中,所有线程都将调用互斥锁上的
pthread\u mutex\u unlock
,而不管它们是否实际锁定了互斥锁。对于使用默认参数创建的互斥体,这构成并且必须固定。

互斥体不是魔法。如果不调用lock,它就不会锁定。检查
someBoolean
是否有锁看起来很可疑,可能会导致数据争用,并不是所有线程都试图锁定互斥锁。@Mat,我的问题是,在它被锁定后,互斥锁是否只会停止传递相同条件并运行到
pthread\u mutex\u锁(&mut)中的线程语句?或者所有线程都会停止,不管它们是否达到
pthread\u mutex\u锁(&mut)语句。正如我所说,没有魔法。如果线程不调用lock,它就不会锁定也不会阻塞。这不是关于互斥锁如何工作的问题,而是关于
If
语句如何工作的问题。如果任何线程计算
someBoolean
,并发现它是
true
,那么它将执行then子句(即
pthread\u mutex\u lock(&mut)
)。如果
someBoolean
false
,则线程不会执行then子句。如果变量与其他线程共享,那么线程在中找到
someBoolean
的状态这个问题可能很难回答。互斥不是魔术。如果不调用lock,它就不会锁定。检查
someBoolean
是否有锁看起来很可疑,可能会导致数据争用,并不是所有线程都试图锁定互斥锁。@Mat,我的问题是,在它被锁定后,互斥锁是否只会停止传递相同条件并运行到
pthread\u mutex\u锁(&mut)中的线程语句?或者所有线程都会停止,不管它们是否达到
pthread\u mutex\u锁(&mut)语句。正如我所说,没有魔法。如果线程不调用lock,它就不会锁定也不会阻塞。这不是关于互斥锁如何工作的问题,而是关于
If
语句如何工作的问题。如果任何线程计算
someBoolean
,并发现它是
true
,则它将执行then子句(即
pthread\u mutex锁(&mut)
)。如果
someBoolean
false
,则线程不会执行then子句。如果变量与其他线程共享,那么线程在中找到
someBoolean
的状态可能很难回答。