концепция мьютекса в потоках POSIX - PullRequest
0 голосов
/ 17 июня 2011

Может кто-нибудь сказать мне, как использовать мьютекс в потоках posix.мы объявляем мьютекс как pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER .. и мы используем pthread_mutex_lock (& ​​mutex1) для блокировки критического кода.но мой вопрос в том, что он блокирует, мы не указали, какой код нужно заблокировать, если у меня есть 4 потока, и я хочу, чтобы ресурсы потока 1 были заблокированы, как я могу сказать это компилятору, и я не в состоянии понять, может кто-нибудь помочь мне, ребята,и каково реальное использование мьютекса в ожидании ответа ..

Ответы [ 3 ]

4 голосов
/ 17 июня 2011

Вам решать, pthreads не указывает, что блокировка делает или не защищает.

например. если вы хотите защитить переменную «a», вы должны убедиться, что все обращения к «a» происходят под защитой мьютекса (скажем, «a_lock»). Для простого (непроверенного) примера


static int a;
static pthread_mutex_t a_lock = PTHREAD_MUTEX_INITIALIZER;

/* Add argument to static variable a in a thread-safe manner and return the result.  (In real life, for this kind of operation you could use an atomic operation) */
int increment_a(int i)
{
  int res;
  pthread_mutex_lock(&a_lock);
  a += i;
  res = a;
  pthread_mutex_unlock(&a_lock);
  return res;
}

То есть, в оборудовании, ОС, библиотеке потоков или чем-либо еще нет ничего, что определяло бы какую-либо связь между данными, которые вы хотите защитить (переменная "a" в примере выше), и мьютексом, который вы Используем для реализации указанной защиты (мьютекс "a_lock" выше). Библиотека pthread гарантирует, что только один поток одновременно может содержать мьютекс.

0 голосов
/ 21 июня 2011

Потоки разделяют память (кроме стека и, возможно, локального хранилища потоков).Итак, вам нужно что-то сделать, чтобы два потока не сталкивались друг с другом.

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

Итак, если вы хотите защитить некоторую структуру данных от одновременного доступа из нескольких потоков, вы ассоциируете мьютекс с этим потоком.и оберните каждый доступ к этой структуре данных в блокировки мьютекса и вызовы разблокировки.Таким образом, вы гарантируете, что только один поток может одновременно получить доступ к структуре данных.

Если поток удерживает мьютекс, а второй поток пытается заблокировать мьютекс, второй поток блокируется (спит) допервый поток разблокирует мьютекс.

0 голосов
/ 17 июня 2011

Код, который он блокирует, защищает, его код между блокировкой и разблокировкой

pthread_mutex_lock(&mtx)
global_var = global_var + 10;
pthread_mutex_unlock(&mtx)

В этом простом случае вы защищаете приращения этой глобальной переменной, это необходимо, потому что процесс приращениячисло занимает три шага:

  1. Чтение текущего значения из ОЗУ
  2. Увеличение этого значения
  3. Запись этого значения обратно в ОЗУ

Давайте сосредоточимся на шагах 1 и 2. Поток МОЖЕТ (и будет уверен в этом) переключиться сразу после шага 1 (чтение), а другой поток прочитает то же значение , что и первыйодин, потому что у него никогда не было возможности обновиться обратно до оперативной памяти.Когда первый поток возобновляет работу (сразу после шага 1), он будет увеличивать это значение, прочитанное ранее, и записывать неверное конечное значение в ram, перезаписывая работу второго потока.

Другими словами:

[Thread 1] Reads the value 10
[Thread 2] Reads the value 10
[Thread 2] Increments it by 5 (value is now 15)
[Thread 2] Writes it back
[Thread 1] Increments it by 5 **(value is now 15)**
[Thread 1] Writes it back
Final value: 15

Окончательное значение должно быть 20, а не 15. Видите проблему?С мьютексом вы можете сериализовать доступ, расставляя вещи в правильном порядке, так что это становится

[Thread 1] Reads the value 10
[Thread 1] Increments it by 5 (value is now 15)
[Thread 1] Writes it back
[Thread 2] Reads the value 15
[Thread 2] Increments it by 5 (value is now 20)
[Thread 2] Writes it back
Final value: 20

Извините, если я запутался, но программирование потоков сначала сбивает с толку.Требуется время, чтобы подумать о многопоточности, но задержаться там!Это очень важная концепция, особенно сейчас, когда многоядерные процессоры являются стандартом де-факто.

...