nixp.ru v3.0

21 октября 2017,
суббота,
02:07:54 MSK

DevOps с компанией «Флант»
Uncle Theodore написал 13 февраля 2005 года в 20:47 (428 просмотров) Ведет себя неопределенно; открыл 58 тем в форуме, оставил 1537 комментариев на сайте.

Читаю разные статьи про threads, не могу врубиться. «Mutex ассоциирован с ресурсом, которым пользуются сразу несколько нитей, дабы избежать race condition» — прекрасно. Смотрю примеры — ни фига он ни с чем не ассоциирован, просто замОк в функции…

#include 
#include 
#include 
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
void *increment(void *arg)
{
  int i;
  for(i=0;i<5;i++)
    {
      pthread_mutex_lock(&mutex1);
      (*(int *)arg)++;
      printf("Thread 1, incrementing the number to %i\n", *(int *)arg);
      sleep(1);
      pthread_mutex_unlock(&mutex1);    
    };
};
void *decrement(void *arg)
{
  int i;
  for(i=0;i<5;i++)
    {
      pthread_mutex_lock(&mutex1);
      (*(int *)arg)--;
      printf("Thread 2, decrementing the number to %i\n", *(int *)arg);
      pthread_mutex_unlock(&mutex1);
    };
};
int main()
{
  pthread_t thread1, thread2;
  int id_1, id_2, i, number = 0;
  id_1 = pthread_create(&thread1, NULL, increment, (void*)&number);
  id_2 = pthread_create(&thread2, NULL, decrement, (void*)&number);
  
  pthread_join(thread1, NULL);
  pthread_join(thread2, NULL);
  return 0;
};

В вышеуказанном примере, как mutex1 вообще соотносится с переменной number? Выглядит, что никак…

Good Luck,

UT

iliya

Так оно и есть.

Он просто область действия функции блокирует.

Genie

mutex не то, чтобы ассоциируется в системе с ресурсом.

вот в программе — да, привязывается программером.

может и не к одному объекту, а к группе.

в общем, там, где действительно необходимо блокировать одновременный (ну, типа) доступ к одному и тому же ресурсу нескольким нитям.

и, действительно, это замок и есть. 60

sas

Как уже было отвечено выше — ассоциация mutex с общими для разных нитей данными целиком лежит на программисте.

Маленькое замечание: блок должен быть минимальным, что в Вашем случае означает что все операции не связанные с изменением значения разделяемого ресурса должны быть вне блока. Иначе быстродействие программы резко падает.

Uncle Theodore

А! Понял. У меня на машине даже мануала по pthread_mutex_lock не было. А вот на Интернете вижу:

A thread attempting to lock a mutex that is already locked by another thread is suspended until the owning thread unlocks the mutex first.

Чудненько. Всем большое спасибо. Я собираюсь две следующие лекции посвятить работе с памятью и процессами путем использования thread’ов и IPC. Так что мне надо самому в этом слегка разбираться. :-) Дети, кстати, тащатся. Первый проект мне сдали не все (еще не разобрался почему, в пятницу вечером deadline был), но в аудитории всегда полный аншлаг.

Намек про минимальный блок понял. Спасибо.

Good Luck,

UT