PTHREAD_MUTEX_INITIALIZER 사용법에 대해서..

mushim의 이미지

pthread_mutex_t mymutex=PTHREAD_MUTEX_INITIALIZER;

이런 식으로 mutex 를 초기화 하는것은 상관없는 데,

mymutex=PTHREAD_MUTEX_INITIALIZER;

다시 초기화를 하기 위해서 위와 같이 하면 parse error 를 내어 버리네요.

찾아보니, /usr/include/pthread.h 에서 아래와 같이 정의되어 있더군요.

#define PTHREAD_MUTEX_INITIALIZER \
  {0, 0, 0, PTHREAD_MUTEX_TIMED_NP, __LOCK_INITIALIZER}

한번 선언된 mutex 를 PTHREAD_MUTEX_INITIALIZER 를 이용해서 초기화 할 수 없나요?

mushim의 이미지

저렇게 쓰는게 C 문법에 맞지 않는것 같군요.

전역 변수로 초기화 mutex 를 만들고, memcpy 하면 되는군요.

pthread_mutex_t init_mutex=PTHREAD_MUTEX_INITIALIZER;

memcpy(&mymutex, &init_mutex, sizeof(pthread_mutex_t));
Dr_stein의 이미지

보통 다이나믹하게 init할땐 이렇게 하는군요.

pthread_mutex_t * mutexp;
.
.
.
mutexp = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t));
pthread_mutex_init(mutexp, NULL);

앞마당 먹고 시작한 저그의 8할은 뮤탈 테크를 먼저 탄다. 하지만 나머지 2할때문에 항상 스켄이 모자란다. - _-;

june8th의 이미지

INITIALIZER사용은 선언과 함께 초기화 할때만 쓰세요.
(pthread 구현마다 다를수 있겠지만요..)
그리고, posix표준화 준수 정도에 따라, INITIALIZER를 못쓰는 경우가 있다더군요.
그래서 그냥, pthread_mutex_init를 하시는 것이 좋다고 알고 있습니다.

xjiwoox의 이미지

PTHREAD_MUTEX_INITIALIZER 대신에 pthread_mutex_init() 를 사용해서 초기화하시면 됩니다.

	pthread_mutex_init(&mymutex, NULL);

s(˘∼˘*)z,·´″"`°³о$ √(´∀`√)... (˘ヘ˘ㆀ)a