mutex



Мьютекс

Автор Paperrose задал вопрос в разделе Другие языки и технологии

mutex, C и получил лучший ответ

Ответ от Carlos[гуру]
C помощью макроса PTHREAD_MUTEX_INITIALIZER можно установить стандартные параметры мьютекса, может использоваться если мы хотим использовать параметры по умолчанию или для инициализации статических мьютексов:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
C помощью функции int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr) инициализируется мьютекс mutex в соответствии с указанными параметрами attr, имеет смысл использовать, если мы хотим использовать не стандартные параметры, например, при задании типа мьютекса:
pthread_mutex_t mutex;
pthread_mutexattr_t attributes;
pthread_mutexattr_init(&attributes);
pthread_mutexattr_settype(&attributes, PTHREAD_MUTEX_FAST_NP);
pthread_mutex_init(&mutex, &attributes);
PS: Не забываем что функции могут завершиться с ошибкой и их возвращаемое значение надо проверять.
Carlos
Мастер
(2423)
PTHREAD_MUTEX_INITIALIZER это макрос, макросы зло (например у меня эта штука разворачивается в { { 0, 0, 0, 0, 0, { 0 } } })
Поэтому например не компилируется код:
#include <pthread.h>
void func(pthread_mutex_t *mutex) {
   *mutex = PTHREAD_MUTEX_INITIALIZER;
}
int main() {
   pthread_mutex_t mutex;
   func(&mutex);
   return 0;
}
Что возможно исправляется с помощью:
void func(pthread_mutex_t *mutex) {
   pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
   *mutex = m;
}
Мьютексы эта така штука которая постоянно не инициализируется, так что можно создавать и динамически.
А макрос скорее всего предполагается использовать в случае:
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int main() {
   // . .
}

Ответ от 3 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: mutex, C
POSIX Threads на Википедии
Посмотрите статью на википедии про POSIX Threads
Мьютекс на Википедии
Посмотрите статью на википедии про Мьютекс
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*