我想我不确定mutex
的工作方式。如果mutex
在某些条件后被锁定,它会仅锁定满足相同条件的线程,还是会锁定所有线程,而与mutex
解锁之前无关?
例如:
if (someBoolean)
pthread_mutex_lock(& mut);
someFunction();
pthread_mutex_unlock(& mut);
会阻止所有线程运行someFunction();
还是仅停止那些通过if语句的线程?
答案 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,并且必须是固定的。