Что именно блокирует мьютекс pthread? - PullRequest
1 голос
/ 22 февраля 2012

Я предполагаю, что это было задано здесь, но я не могу найти этот конкретный вопрос.Это просто блокирует часть кода между блокировкой и разблокировкой, или это блокирует глобальные переменные?Как для этого кода

pthread_mutex_lock(&mtx);
bitmap[index] = 1;
pthread_mutex_unlock(&mtx);

мьютекс просто блокирует эту строку кода?Есть ли способ заблокировать определенные переменные, не блокируя только часть кода, которая их использует?

Ответы [ 2 ]

5 голосов
/ 22 февраля 2012

Нет, она блокирует фактическую переменную мьютекса.

Любой фрагмент кода, который пытается заблокировать этот мьютекс, пока он заблокирован, будет блокироваться, пока он не будет разблокирован.

Если это единственный фрагмент кода, который блокирует мьютекс, то да, вы можете сказать, что он просто защищает эту строку. Но это не обязательно так.

Мьютекс используется для сериализации доступа к ресурсу. Независимо от того, считается ли этот ресурс строкой кода или (более вероятно, в этом случае) массив bitmap находится там, где мьютекс заблокирован и разблокирован.

Скорее всего, у вас есть несколько областей, где массив bitmap читается или изменяется, и вы, вероятно, должны убедиться, что они все защищены мьютексом.

3 голосов
/ 22 февраля 2012

Нет, просто заблокировать переменную невозможно.

Мьютекс - это просто абстракция. Поэтому, когда вы хотите, чтобы какая-либо переменная не затрагивалась, когда вы работаете с ней, объявите мьютекс для этой переменной и заблокируйте ее столько, сколько вы хотите.

Нет прямой связи между мьютексом и переменной, которую вы хотите заблокировать. Это до программиста. Чаще всего он используется в многопоточной среде.

Всякий раз, когда переменная (ресурс. В программировании ресурсы управляются переменными) распределяется между параллельно запущенными процессами (в соответствии с ядром потоки одного и того же процесса являются группой процессов, совместно использующих одно и то же адресное пространство и некоторые ресурсы), если программист хочет, чтобы к переменной обращался только один процесс в определенное время, он должен записать блок кода, обращающийся к переменной во всех процессах (или потоках) между парой блокировок мьютекса (pthread_mutex_lock и pthread_mutex_unlock). Таким образом, всякий раз, когда к переменной обращаются в любом процессе (или потоке), мьютекс будет заблокирован. Поэтому, если другой процесс хочет получить доступ к переменной, он должен дождаться разблокировки мьютекса. Таким образом, конечная цель программистов достигнута.

...