日期:2014-05-16  浏览次数:20743 次

mutex到底锁住哪个变量?
pthread_mutex_init初始化的mutex,跟PTHREAD_MUTEX_INITIALIZER初始化的其中的区别是
不是前者用来锁住动态生成的变量,后者是static变量?
如果有两个或两个以上的动态形成的变量,那么用第一种方法,锁住的是哪一个呢?是不是
在线程函数中所有的动态生成的变量都锁住了啊? 


------解决方案--------------------
那个hashlock保护的是struct foo *f_next指针, 在给这个指针赋值建立连接表时需要取得这个锁.
而f_lock保护的是整个struct foo结构变量, 在对结构中的任意成员进行操作时需要取得这个锁.

至于楼主所说的那两种初始化方式, 在这段程序中体现在, struct foo *fp这个地方由于建立的是指针, 并且由malloc分配内存, f_lock是foo结构的成员, 所以它的初始化要用动态方式. 即: pthread_mutex_init(&fp->f_lock, NULL).
------解决方案--------------------
感觉楼主是概念理解错误,mutex互斥信号量锁住的不是一个变量,而是阻赛住一段程序。

如果对一个mutex变量testlock, 执行了第一次pthread_mutex_lock(testlock)之后,在unlock(testlock)之前的这段时间内,如果有其他线程也执行到了pthread_mutex_lock(testlock),这个线程就会阻塞住,直到之前的线程unlock之后才能执行,由此,实现同步,也就达到保护临界区资源的目的。

下面一个测试程序,可以帮助你理解。

#include<stdio.h>
#include<pthread.h>

static pthread_mutex_t testlock;
pthread_t test_thread;

void *test()
{
pthread_mutex_lock(&testlock);
printf("thread Test() \n");
pthread_mutex_unlock(&testlock);
}

int main()
{
pthread_mutex_init(&testlock, NULL);
pthread_mutex_lock(&testlock); 

printf("Main lock \n");

pthread_create(&test_thread, NULL, test, NULL);
sleep(1);

printf("Main unlock \n");
pthread_mutex_unlock(&testlock);

sleep(1);

return 0;
}

make
gcc -D_REENTRANT -lpthread -o test test.c

结果:
Main lock 
Main unlock 
thread Test()