Мьютекс
Автор 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() {
// . .
}