C:如何使用POSIX线程声明递归互斥锁?

Pit*_*kos 45 c multithreading mutex pthreads recursive-mutex

我对如何使用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
Run Code Online (Sandbox Code Playgroud)

所以我尝试做的只是串行读取/删除队列.

问题在于,没有任何关于如何声明递归互斥体的例子.或者可能有一些,但他们不为我编译.

Pio*_*lka 80

来自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);
Run Code Online (Sandbox Code Playgroud)

我在生产中实际使用了这个代码,我知道它在Linux,Solaris,HP-UX,AIX,Mac OSX和FreeBSD上都能正常工作.

/编辑

您还需要添加适当的链接器标志来编译它.

AIX,Linux,FreeBSD:
CPLATFORM + = -pthread

mingw32:
LDFLAGS + = -lpthread

  • 最后需要`pthread_mutexattr_destroy(&Attr)`,否则您将泄漏内存。 (2认同)

Mic*_*kis 16

要创建递归互斥锁,请使用:

#include <pthread.h>
int pthread_mutexatttr_settype(pthread_mutexattr_t *attr,
                               int type);
Run Code Online (Sandbox Code Playgroud)

类型是什么PTHREAD_MUTEX_RECURSIVE.

别忘了检查返回值!

例:

/* or PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP */
pthread_mutex_t       mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutexattr_t   mta;
Run Code Online (Sandbox Code Playgroud)

或者,在运行时初始化(不要同时执行,它是未定义的行为):

pthread_mutexattr_init(&mta);
/* or PTHREAD_MUTEX_RECURSIVE_NP */
pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_RECURSIVE);

pthread_mutex_init(&mutex, &mta);
Run Code Online (Sandbox Code Playgroud)


Bas*_*tch 14

在Linux上(但是这对于其他系统是不可移植的),如果互斥锁是全局变量或静态变量,则可以将其初始化为

static pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢(你的)信息。因此,我在MAC上发现它是:static pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER; (2认同)