C:你如何用POSIX线程声明一个recursion互斥?

我有点困惑如何使用pthread声明一个recursion互斥。 我试图做的是一次只能有一个线程能够运行一段代码(包括函数),但是在怀疑之后,我发现互斥锁的使用将不起作用,而我应该使用recursion互斥体(recursive mutexes)。 这是我的代码:

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 

所以我试图做的只是连续读取/从队列中删除。

关于如何声明recursion互斥体,没有任何例子。 或者也许有一些,但他们不为我编译。

来自Michael Foukarakis的代码几乎不错,但是他初始化了互斥锁两次,导致了未定义的行为。 它应该是这样的:

 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和FreeBSD上都能正常工作。

/编辑

您还需要添加适当的链接器标志来编译这个。

AIX,Linux,FreeBSD:
CPLATFORM + = -pthread

mingw32的:
LDFLAGS + = -lpthread

要创buildrecursion互斥,请使用:

 #include <pthread.h> int pthread_mutexatttr_settype(pthread_mutexattr_t *attr, int type); 

其中types是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上(但这对其他系统是不可移植的),如果互斥锁是一个全局variables或静态variables,那么可以像初始化它

 static pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; 

(顺便说一句,这个例子来自pthread_mutex_init(3) 手册页!)

创build互斥体时,您需要添加互斥体属性。

调用pthread_mutexattr_init ,然后使用PTHREAD_MUTEX_RECURSIVE调用pthread_mutexattr_init ,然后在pthread_mutexattr_settype使用这些属性。 请阅读man pthread_mutexattr_init了解更多信息。