当前位置: 技术问答>linux和unix
mutex到底锁住哪个变量?
来源: 互联网 发布时间:2016-02-26
本文导语: pthread_mutex_init初始化的mutex,跟PTHREAD_MUTEX_INITIALIZER初始化的其中的区别是 不是前者用来锁住动态生成的变量,后者是static变量? 如果有两个或两个以上的动态形成的变量,那么用第一种方法,锁住的是哪一个呢?是...
pthread_mutex_init初始化的mutex,跟PTHREAD_MUTEX_INITIALIZER初始化的其中的区别是
不是前者用来锁住动态生成的变量,后者是static变量?
如果有两个或两个以上的动态形成的变量,那么用第一种方法,锁住的是哪一个呢?是不是
在线程函数中所有的动态生成的变量都锁住了啊? [m
不是前者用来锁住动态生成的变量,后者是static变量?
如果有两个或两个以上的动态形成的变量,那么用第一种方法,锁住的是哪一个呢?是不是
在线程函数中所有的动态生成的变量都锁住了啊? [m
|
感觉楼主是概念理解错误,mutex互斥信号量锁住的不是一个变量,而是阻赛住一段程序。
如果对一个mutex变量testlock, 执行了第一次pthread_mutex_lock(testlock)之后,在unlock(testlock)之前的这段时间内,如果有其他线程也执行到了pthread_mutex_lock(testlock),这个线程就会阻塞住,直到之前的线程unlock之后才能执行,由此,实现同步,也就达到保护临界区资源的目的。
下面一个测试程序,可以帮助你理解。
#include
#include
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()
如果对一个mutex变量testlock, 执行了第一次pthread_mutex_lock(testlock)之后,在unlock(testlock)之前的这段时间内,如果有其他线程也执行到了pthread_mutex_lock(testlock),这个线程就会阻塞住,直到之前的线程unlock之后才能执行,由此,实现同步,也就达到保护临界区资源的目的。
下面一个测试程序,可以帮助你理解。
#include
#include
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()
|
那个hashlock保护的是struct foo *f_next指针, 在给这个指针赋值建立连接表时需要取得这个锁.
而f_lock保护的是整个struct foo结构变量, 在对结构中的任意成员进行操作时需要取得这个锁.
至于楼主所说的那两种初始化方式, 在这段程序中体现在, struct foo *fp这个地方由于建立的是指针, 并且由malloc分配内存, f_lock是foo结构的成员, 所以它的初始化要用动态方式. 即: pthread_mutex_init(&fp->f_lock, NULL).
而f_lock保护的是整个struct foo结构变量, 在对结构中的任意成员进行操作时需要取得这个锁.
至于楼主所说的那两种初始化方式, 在这段程序中体现在, struct foo *fp这个地方由于建立的是指针, 并且由malloc分配内存, f_lock是foo结构的成员, 所以它的初始化要用动态方式. 即: pthread_mutex_init(&fp->f_lock, NULL).