Как я должен инициализировать мьютексы 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() не определен. Попытка инициализировать уже инициализированный мьютекс приводит к неопределенному поведению.
Обычно метод с вызовом функции используется, если вы хотите установить атрибуты для блокировки (второй аргумент функции), такие как разделяемый между процессами или рекурсивный.