Как я должен инициализировать мьютексы pthread?

#include <pthread.h>

pthread_mutex_t* mut;

int main()
{
        mut = PTHREAD_MUTEX_INITIALIZER;
}

Вышеприведенный код выплевывает error: expected expression before ‘{’ token,

#include <pthread.h>

pthread_mutex_t* mut = PTHREAD_MUTEX_INITIALIZER;

int main()
{

}

Приведенный выше код выдает предупреждение: скобки вокруг скалярного инициализатора

Так как же мне инициализировать мьютекс?

2 ответа

Решение

Это ошибка типа, вы должны использовать: pthread_mutex_t вместо pthread_mutex_t*:

pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;

Причина, по которой компилятор жалуется, заключается в том, что он пытается назначить это расширение макроса PTHREAD_MUTEX_INITIALIZER на указатель:

{ { 0, 0, 0, 0, 0, __PTHREAD_SPINS, { 0, 0 } } }

С исправленным подходом вы можете пройти &mut везде, где вам нужно pthread_mutex_t*,

Во-первых, вы должны объявить это как pthread_mutex_t а не как указатель pthread_mutex_t *, Вы также должны решить, является ли мьютекс глобальным или локальным для функции.

Если он глобальный, вы можете инициализировать его, используя: pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;

Если это местный, вы должны позвонить: pthread_mutex_init(&mut,NULL); (вы должны проверить возвращаемое значение)

Обратите внимание, что PTHREAD_MUTEX_INITIALIZER является макросом, и вы не можете назначить его указателю.

От pthread_mutex_init() справочная страница:

Только сам мьютекс может использоваться для выполнения синхронизации. Результат обращения к копиям мьютекса в вызовах pthread_mutex_lock(), pthread_mutex_trylock(), pthread_mutex_unlock() и pthread_mutex_destroy() не определен. Попытка инициализировать уже инициализированный мьютекс приводит к неопределенному поведению.

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

Другие вопросы по тегам