Чтобы разделить мьютекс с помощью pthreads, вам нужно каким-то образом поделиться адресом мьютекса через указатель или сделать мьютекс глобальной переменной.
Мьютексы или семафоры сами по себе не блокируют заданную память или критический участок кода ... вместо этого они блокируют доступ к определенному «флагу» или местоположению в памяти (то есть, как unsigned long
или некоторый другой тип POD), который является затем используется для определения доступа к критическому разделу или другой общедоступной ячейке памяти. Другими словами, как только поток «владеет» данным мьютексом, он получает доступ к сегменту кода или секции памяти, из которой любой другой поток, пытающийся получить право собственности на тот же мьютекс, блокируется на время блокировки владеющего потока.
Если вы используете два разных мьютекса для блокировки доступа к заданному местоположению, это не обеспечивает взаимоисключающий доступ к реальному сегменту памяти ... каждый поток, который не разделяет мьютекс, будет иметь равный доступ к сегменту памяти, даже если у каждого из них может быть замок владения на соответствующих мьютексах. Поэтому сегмент памяти на самом деле не защищен ... два потока могут одновременно обращаться к сегменту памяти, создавая проблемы параллелизма.
Итак, еще раз, если у вас есть разные модули или потоки, и вы хотите иметь эксклюзивный доступ к заданному разделу кода или памяти, вам придется разделить мьютекс с одинаковым между этими элементами , Это можно сделать многими способами, например, с помощью именованных семафоров, если это необходимо для нескольких отдельных процессов, или с помощью сегмента общей памяти (т. Е. shmget()
, shmat()
, shmdt
и т. Д.). ) и т. д., если вы не можете каким-либо образом использовать глобально доступный мьютекс или указатель из-за некоторого разделения адресного пространства между вашими модулями.