C ++ Pthread互斥锁

时间:2018-08-23 07:40:50

标签: c++ multithreading pthreads

我想我不确定mutex的工作方式。如果mutex在某些条件后被锁定,它会仅锁定满足相同条件的线程,还是会锁定所有线程,而与mutex解锁之前无关?

例如:

if (someBoolean)
    pthread_mutex_lock(& mut);

someFunction();

pthread_mutex_unlock(& mut);

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

2 个答案:

答案 0 :(得分:3)

您需要调用pthread_mutex_lock()才能锁定线程。如果在线程A中而不是线程B中调用pthread_mutex锁定,则线程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.

答案 1 :(得分:2)

  

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

someBoolean为真的线程将获得锁定。因此,只有在其他人持有相同锁的情况下,才会阻止这些线程调用someFunction()

但是,在提供的代码中,所有线程都将在互斥量上调用pthread_mutex_unlock,无论它们是否实际锁定了互斥量。对于使用默认参数创建的互斥锁,它构成undefined behavior,并且必须是固定的。