Uncle Theodore
написал 13 февраля 2005 года в 20:47 (979 просмотров)
Ведет себя
неопределенно; открыл 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
Последние комментарии
-
OlegL, 17 декабря 2023 года в 15:00 →
Перекличка
21
-
REDkiy, 8 июня 2023 года в 9:09 →
Как «замокать» файл для юниттеста в Python?
2
-
fhunter, 29 ноября 2022 года в 2:09 →
Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt?
6
-
Иванн, 9 апреля 2022 года в 8:31 →
Ассоциация РАСПО провела первое учредительное собрание
1
-
Kiri11.ADV1, 7 марта 2021 года в 12:01 →
Логи catalina.out в TomCat 9 в формате JSON
1
DevOps as a Service from Palark
24/7 SRE & DevOps service to cover all your Kubernetes needs.

Так оно и есть.
Он просто область действия функции блокирует.
mutex не то, чтобы ассоциируется в системе с ресурсом.
вот в программе — да, привязывается программером.
может и не к одному объекту, а к группе.
в общем, там, где действительно необходимо блокировать одновременный (ну, типа) доступ к одному и тому же ресурсу нескольким нитям.
и, действительно, это замок и есть. 60
Как уже было отвечено выше — ассоциация mutex с общими для разных нитей данными целиком лежит на программисте.
Маленькое замечание: блок должен быть минимальным, что в Вашем случае означает что все операции не связанные с изменением значения разделяемого ресурса должны быть вне блока. Иначе быстродействие программы резко падает.
А! Понял. У меня на машине даже мануала по 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