Мьютекс - это механизм реализации критических секций.
Любой код между вызовами pthread_mutex_lock(x)
и pthread_mutex_unlock(x)
будет выполняться только в одном потоке в любой момент времени.Вот и все.
Итак ...
1.Может ли другой поток одновременно выполняться, когда mtx заблокирован?
Если он не заблокировал mtx, тогда, конечно.
2.Какая польза от строки 2, поскольку newThread может разблокировать mtx только тогда, когда строка 4 была выполнена, и, таким образом, делает строку 2 избыточной?
Мьютекс становится бесполезным, и вы также получаете UB , поскольку вы разблокируете его в потоке, который его не блокировал:
Если тип мьютекса - PTHREAD_MUTEX_DEFAULT
...
Попытка разблокировать мьютекс, еслион не был заблокирован вызывающим потоком, что приводит к неопределенному поведению.
(по умолчанию вы получаете тип мьютекса PTHREAD_MUTEX_DEFAULT
)
3.Что произойдет, если строка 1 не закомментирована?
Вы получите thread голодание , так как мьютекс блокируется почти все время и немедленноблокируется после разблокировки (POSIX не гарантирует справедливость мьютекса).
Семафор POSIX в некоторых случаях обеспечивает справедливость (при использовании планировщиков SCHED_FIFO
или SCHED_RR
),но тяжелее .
Я не совсем понимаю, чего вы пытаетесь достичь (приложение выглядит надуманным).В реальном приложении, вероятно, существует некий логический порядок действий, которые должен выполнить любой поток.Поэтому, если у вас работает семафор, я бы сохранил его и удалил мьютекс.