当前位置:  技术问答>linux和unix

mutex到底锁住哪个变量?

    来源: 互联网  发布时间:2016-02-26

    本文导语:  pthread_mutex_init初始化的mutex,跟PTHREAD_MUTEX_INITIALIZER初始化的其中的区别是 不是前者用来锁住动态生成的变量,后者是static变量? 如果有两个或两个以上的动态形成的变量,那么用第一种方法,锁住的是哪一个呢?是...

pthread_mutex_init初始化的mutex,跟PTHREAD_MUTEX_INITIALIZER初始化的其中的区别是
不是前者用来锁住动态生成的变量,后者是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()

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

至于楼主所说的那两种初始化方式, 在这段程序中体现在, struct foo *fp这个地方由于建立的是指针, 并且由malloc分配内存, f_lock是foo结构的成员, 所以它的初始化要用动态方式. 即: pthread_mutex_init(&fp->f_lock, NULL).

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • init_MUTEX_LOCKED和init_MUTEX的区别是什么?
  • 请问pthread_mutex_lock()和pthread_mutex_unlock()可不可以用于对不同进程的线程进行同步。
  • pthread_mutex
  • pthread_mutex_destroy()调用失败的原因
  • 关于pthread_mutex_lock的问题,请教各位
  • 有关 mutex和内核抢占的问题
  • 请教:pthread_mutex_lock()后加sleep(1)=解锁?
  • linux下进程同步有mutex吗?
  • linux下的进程如何访问另外一个进程建立的mutex?
  • PTHREAD_MUTEX_INITIALIZER的问题
  • 能不能查看获取pthread_mutex_t的线程id?
  • volatile 与 mutex的问题
  • 多线程问题,pthread_mutex_trylock,很简单的函数,为什么总是失败呢?请大侠指教!
  • C++中,为什么执行pthread_mutex_lock()时执行了两次线程才被阻塞?
  • pthread_mutex_lock互斥量问题
  • # define PTHREAD_MUTEX_INITIALIZER { { 0, 0, 0, 0, 0, 0, { 0, 0 } } } 看不懂
  • 临界区 pthread_mutex_t
  • 如何调试一个程序,看某时刻哪个线程被唤醒,哪个mutex之类的东西被设
  • 哪本书介绍mutex、POSIX 线程详解
  • ubuntu下多线程程序运行出现:Assertion `mutex->__data.__owner == 0' failed异常


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    NOSQL iis7站长之家