PTHREAD_MUTEX_INITIALIZER,这是什么?

时间:2014-12-01 19:04:53

标签: multithreading pthreads

我读了很多关于PTHREAD_MUTEX_INITIALIZER的文章,我明白它做了什么,但是,我无法理解它是如何做到的?如何通过将变量名称赋值给该变量来使用宏来初始化变量。

我对Macros的了解是,它们可以像函数一样使用,例如:

#define MAX(a, b) ((a) > (b) ? (a) : (b))

现在我们可以将此宏用作以下函数:Max(a,b)。

但是我们如何编写一个可以像PTHREAD_MUTEX_INITIALIZER一样使用的宏,如:

int x = Macro_Name;

然后x将被初始化为特定值(例如,一旦为其分配了PTHREAD_MUTEX_INITIALIZER,就会初始化互斥锁)

请帮助我理解这个问题。提前谢谢。

1 个答案:

答案 0 :(得分:0)

以下是来自http://git.savannah.gnu.org/cgit/hurd/libpthread.git/tree/sysdeps/generic/bits/mutex.h的libpthread源代码片段(我只删除了与该问题无关的评论)

/* User visible part of a mutex.  */
struct __pthread_mutex
  {
    __pthread_spinlock_t __held;
    __pthread_spinlock_t __lock;
    char *cthreadscompat1;
    struct __pthread *__queue;
    struct __pthread_mutexattr *attr;
    void *data;
    void *owner;
    unsigned locks;
  };

#  define __PTHREAD_MUTEX_INITIALIZER \
    { __PTHREAD_SPIN_LOCK_INITIALIZER, __PTHREAD_SPIN_LOCK_INITIALIZER, 0, 0, 0, 0, 0, 0 }

由此可以看出,宏隐藏了表示“互斥体的用户可见部分”的结构的初始化列表。结构的大多数成员(包括指针)都设置为0,内部自旋锁使用自己的初始化宏进行初始化,初始化宏可能是相似的。

当然它只是一个实现,但我猜其他实现可能有类似的东西。