C:如何使用POSIX线程声明递归互斥锁?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C:如何使用POSIX线程声明递归互斥锁?相关的知识,希望对你有一定的参考价值。
我对如何使用pthread声明递归互斥锁感到困惑。我尝试做的是一次只有一个线程能够运行一段代码(包括函数)但是在怀疑之后我发现使用互斥量不起作用而我应该使用递归互斥锁。这是我的代码:
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
所以我尝试做的只是串行读取/删除队列。
问题在于,没有任何关于如何声明递归互斥体的例子。或者可能有一些,但他们不为我编译。
来自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
要创建递归互斥锁,请使用:
#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上(但这对于其他系统是不可移植的),如果互斥锁是全局变量或静态变量,您可以将其初始化为
static pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
(顺便说一句,这个例子来自pthread_mutex_init(3)
手册页!)
创建互斥锁时需要添加互斥锁属性。
用pthread_mutexattr_init
调用pthread_mutexattr_settype
然后PTHREAD_MUTEX_RECURSIVE
然后使用pthread_mutex_init
这些属性。阅读man pthread_mutexattr_init
了解更多信息。
以上是关于C:如何使用POSIX线程声明递归互斥锁?的主要内容,如果未能解决你的问题,请参考以下文章