programing

C: POSIX 스레드를 사용하여 재귀 뮤텍스를 선언하려면 어떻게 해야 합니까?

prostudy 2022. 7. 7. 22:29
반응형

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

반응형