2014-12-01 212 views
0

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

我所知道的关于宏的是,他们可以用同样的功能,如:

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

现在我们可以使用这个宏像一个函数:MAX(A,B)。

但我们如何编写能在方式使用宏其PTHREAD_MUTEX_INITIALIZER使用,如:

int x = Macro_Name; 

那么x会被初始化为特定值(当一次PTHREAD_MUTEX_INITIALIZER是一个互斥量初始化像分配给它)

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

回答

0

这里是从的libpthread的源代码,从http://git.savannah.gnu.org/cgit/hurd/libpthread.git/tree/sysdeps/generic/bits/mutex.h截取的片段(I仅除去那些unrelevant的问题评论)

/* 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,并且内部自旋锁使用它们自己的初始化宏进行初始化,这可能类似地定义。

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