hbmhalley 发表于 2011-12-03 18:22

条件变量为什么要用互斥锁来保护?

如果pthread_cond_wait只有cond*一个参数,pthread_cond_signal也只有cond*一个参数,一个用来等,一个用来唤醒,工作的也挺好的不是么?
所有书所有资料所有人都说“互斥锁用来保护条件变量”“防止竞争”等等,为什么要保护?防止什么竞争?这个mutex的作用到底是什么?如果所有使用pthread_cond_wait的地方mutex参数各不相同,那么这个mutex参数是不是就相当于没有用了?
谢谢!!

赤夜萌香 发表于 2011-12-03 18:26

个人理解走到pthread_cond_wait后,如果条件不满足
该线程就休眠了,等待条件满足后被唤醒。节省了线程不断运行浪费的资源

hbmhalley 发表于 2011-12-03 18:28

回复 2# 赤夜萌香


    是啊是啊我的理解和你完全一样 但整个过程中和mutex有半毛钱关系么?? 晕死我了 ..

赤夜萌香 发表于 2011-12-03 18:30

有关系,pthread_cond_wait内需要写入mutex变量参数

hbmhalley 发表于 2011-12-03 18:35

回复 4# 赤夜萌香


    = =囧   我就是想问设计者为什么要额外加这么一个mutex参数?如果不加会出什么问题?那些所谓“竞争”“保护”指的是什么?

    谢谢!

赤夜萌香 发表于 2011-12-03 18:39

这个解释起来,就涉及mutex了,你会用互拆锁的话,后面的应该也不难。
pthread_cond_wait他除了判断条件是否满足,还有控制mutex的功能,
如果不满足条件,他要先释放互拆锁,在进入睡眠中

赤夜萌香 发表于 2011-12-03 18:45

本帖最后由 赤夜萌香 于 2011-12-03 18:46 编辑

也不能说让pthread_cond_wait判断条件,这个条件还是编译者自己给的,
如一个while循环,循环里的条件不满足了,就不做pthread_cond_wait
满足就执行pthread_cond_wait,执行pthread_cond_wait就会进入睡眠,但是会在睡眠前先释放他控制的互拆锁

hbmhalley 发表于 2011-12-03 19:08

回复 6# 赤夜萌香


    对,就是这里不明白。比如pthread_cond_wait (&COND , &MUTEX) ,那么这个函数只是简单地将三个类似 unlock(MUTEX), wait(COND), lock(MUTEX) 的函数原子地绑在一起而已么?如果是的话,那么这么做目的是什么?满足某个条件时也很有可能需要同时开始好多任务啊,为什么要强行lock掉呢?

赤夜萌香 发表于 2011-12-03 19:18

本帖最后由 赤夜萌香 于 2011-12-03 19:20 编辑

pthread_cond_wait,pthread_cond_signal
与pthread_mutex_lock,pthread_mutex_unlock;
是两部分,先有后者,后者使用上有不足处,故需要用前者来弥补。前者只是一个辅助弥补;

关键还是理解后者的用法,完全理解了,再去看前者是如何辅助lock与unlock的不足的;

如果还不能完全消化mutex部分就去看 cond会自然狠吃力,建议先完全理解mutex

hbmhalley 发表于 2011-12-03 19:37

回复 9# 赤夜萌香


    多谢!好像明白了 ..是不是因为mutex只有锁定与否,但继续运行的条件不只“mutex未锁”这么简单,所以用cond暂时阻塞并解锁以让出资源?

    如果是这样,那么如果我想实现一个简单得多的功能:当变量x为0时继续运行,此时mutex还有用么?直接写成 while (x) wait(&cond)就可以了是么?

    .. 也就是说 .. 条件变量从一开始就不是我所想象的那个用途么 ..
页: [1] 2
查看完整版本: 条件变量为什么要用互斥锁来保护?