C: POSIX 스레드를 사용하여 재귀 뮤텍스를 선언하려면 어떻게 해야 합니까?
pthread를 사용하여 재귀 뮤텍스를 선언하는 방법이 조금 혼란스럽습니다.한 번에 1개의 스레드(함수 포함)만 실행할 수 있도록 하고 있습니다만, 회의적인 결과 뮤텍스는 사용할 수 없고, 대신 재귀 뮤텍스를 사용해야 한다는 것을 알았습니다.코드는 다음과 같습니다.
pthread_mutex_lock(&mutex); // LOCK
item = queue_peek(queue); // get last item in queue
item_buff=item; // save item to a buffer
queue_removelast(queue); // remove last item from queue
pthread_mutex_unlock(&mutex); // UNLOCK
큐에서 순서대로 읽거나 삭제하려고 합니다.
문제는 재귀 뮤텍스를 선언하는 방법에 대한 예가 없다는 것입니다.아니면 몇 개 있을 수도 있지만, 그들은 나를 위해 컴파일하지 않는다.
마이클 푸카라키스의 코드는 거의 좋지만 그는 뮤텍스를 두 번 초기화해서 정의되지 않은 행동을 하게 된다.다음과 같이 해야 합니다.
pthread_mutex_t Mutex;
pthread_mutexattr_t Attr;
pthread_mutexattr_init(&Attr);
pthread_mutexattr_settype(&Attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&Mutex, &Attr);
실제로 이 코드를 프로덕션에서 사용하고 있으며 Linux, Solaris, HP-UX, AIX, Mac OSX 및 FreeB에서 올바르게 작동한다는 것을 알고 있습니다.SD.
또한 적절한 링커플래그를 추가하여 컴파일해야 합니다.
AIX, Linux, FreeBSD:
CPLATFORM += -pthread
mingw32:
LDFLAGS += -lpthread
재귀 뮤텍스를 작성하려면 다음 명령을 사용합니다.
#include <pthread.h>
int pthread_mutexatttr_settype(pthread_mutexattr_t *attr,
int type);
여기서 type은PTHREAD_MUTEX_RECURSIVE
.
반환값을 확인하는 것을 잊지 마세요!
예:
/* or PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP */
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutexattr_t mta;
또는 런타임에 초기화합니다(둘 다 하지 마십시오. 정의되지 않은 동작입니다).
pthread_mutexattr_init(&mta);
/* or PTHREAD_MUTEX_RECURSIVE_NP */
pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&mutex, &mta);
Linux(단, 다른 시스템에서는 이식할 수 없음)에서는 mutex가 글로벌 변수 또는 정적 변수인 경우 다음과 같이 초기화할 수 있습니다.
static pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
(그런데 이 예는pthread_mutex_init(3)
man page!)
뮤텍스를 작성할 때는 뮤텍스 속성을 추가해야 합니다.
불러pthread_mutexattr_init
,그리고나서pthread_mutexattr_settype
와 함께PTHREAD_MUTEX_RECURSIVE
그런 다음 이러한 Atribute를 사용하여pthread_mutex_init
.읽어주세요man pthread_mutexattr_init
자세한 것은, 을 참조해 주세요.
언급URL : https://stackoverflow.com/questions/7037481/c-how-do-you-declare-a-recursive-mutex-with-posix-threads
'programing' 카테고리의 다른 글
코어 파일은 덤프되었지만 코어 파일은 덤프되었습니다. (0) | 2022.07.07 |
---|---|
긴 vs 정수, 긴 vs int, 무엇을 언제 사용할 것인가? (0) | 2022.07.07 |
VueJ를 사용한 동적 입력 필드 추가 (0) | 2022.07.07 |
기본 포인터와 스택 포인터란 정확히 무엇입니까?그들은 무엇을 가리키고 있나요? (0) | 2022.07.07 |
vue-google-map set infow는 마커 위에 있습니다. (0) | 2022.07.07 |