我读了很多关于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,就会初始化互斥锁)
请帮助我理解这个问题。提前谢谢。
答案 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,内部自旋锁使用自己的初始化宏进行初始化,初始化宏可能是相似的。
当然它只是一个实现,但我猜其他实现可能有类似的东西。