免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10902 | 回复: 11
打印 上一主题 下一主题

[函数] pthread_cond_wait的疑惑? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-04 22:05 |只看该作者 |倒序浏览
书上一般使用pthread_cond_wait是这样用的:

条件变量V初始化,互斥量V初始化;

pthread_mutex_lock(&m);
while(!wait_condition)
    pthread_cond_wait(&v, &m);
pthread_mutex_unlock(&m);


之所以要用 while(condition)  pthread_cond_wait(&v, &m)这种结构,是为了防止pthread_cond_wait由于错误的pthread_cond_signal()或者收到信号而返回

我的疑问是:
什么信号能使pthread_cond_wait()返回呢?我实验了一下SIGUSR1这个信号,如果捕捉这个信号,在执行了捕捉函数以后,pthread_cond_wait()也没有返回; 如果不捕捉这个信号,使用默认设置,那pthread_cond_wait()所在的整个进程都被杀了。
那书中书的pthread_cond_wait收到信号而返回是什么意思呢?
谢谢!

[ 本帖最后由 new_learner 于 2008-3-4 22:42 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-03-04 22:23 |只看该作者
信号量,不是信号。

论坛徽章:
0
3 [报告]
发表于 2008-03-04 22:42 |只看该作者
哦 不好意思 改正过来了

论坛徽章:
0
4 [报告]
发表于 2008-03-04 23:13 |只看该作者
pthread类的同步函数基本都不会被信号中断;
man pthread_cond_wait


ERRORS
       The pthread_cond_timedwait() function shall fail if:

       ETIMEDOUT
              The time specified by abstime to pthread_cond_timedwait() has passed.

       The pthread_cond_timedwait() and pthread_cond_wait() functions may fail if:

       EINVAL The value specified by cond, mutex, or abstime is invalid.

       EINVAL Different mutexes were supplied for concurrent pthread_cond_timedwait() or pthread_cond_wait() operations on
              the same condition variable.

       EPERM  The mutex was not owned by the current thread at the time of the call.

       These functions shall not return an error code of [EINTR].

       The following sections are informative.

论坛徽章:
0
5 [报告]
发表于 2008-03-10 18:49 |只看该作者
我看书上说的:
“因为返回可能是由某些不相关的事件或无法使断言成真的pthread_cond_signal引起的,所以要在从pthread_cond_wait返回之后重新对断言进行测试”

这里的“某些不相关的事件”具体是指什么呢?

论坛徽章:
0
6 [报告]
发表于 2008-03-10 20:17 |只看该作者
https://svn.lcuc.org.cn/public/s ... TestMultiThread.cpp

一个面对多部手机自动测试的用例

论坛徽章:
0
7 [报告]
发表于 2008-03-10 20:33 |只看该作者
原帖由 new_learner 于 2008-3-10 18:49 发表
我看书上说的:
“因为返回可能是由某些不相关的事件或无法使断言成真的pthread_cond_signal引起的,所以要在从pthread_cond_wait返回之后重新对断言进行测试”

这里的“某些不相关的事件”具体是指什么呢?


你引用的话说的很清楚阿,“由某些不相关的事件或无法使断言成真的pthread_cond_signal引起的“,指的是业务相关的事件。
比如你在一个pthread_cond_t上定义了多个事件,当这个被pthread_cond_signal触发后,当然要检查是否是该程序所期待的事情。

论坛徽章:
0
8 [报告]
发表于 2008-03-10 20:42 |只看该作者
pthread_mutex_lock(&m);
while(!wait_condition)
    pthread_cond_wait(&v, &m);
/**/
pthread_mutex_unlock(&m);
在到达注释的那段代码的时候,那么wait_conditon == 0成立

但是如果把while改成if,那么如果多个线程存在的话,当到达注释代码的时候wait_condition就不一定是0了

论坛徽章:
0
9 [报告]
发表于 2008-03-10 21:03 |只看该作者
原帖由 lalala 于 2008-3-10 20:33 发表


你引用的话说的很清楚阿,“由某些不相关的事件或无法使断言成真的pthread_cond_signal引起的“,指的是业务相关的事件。
比如你在一个pthread_cond_t上定义了多个事件,当这个被pthread_cond_signal触发后 ...


你的意思是不是如果某个条件变量V与多个断言绑定在一起的情况?

我看这段话的时候,以为是除了pthread_cond_signal这个函数以为,还有其他的函数或者信号能使pthread_cond_wait返回。。。

论坛徽章:
0
10 [报告]
发表于 2008-03-10 21:05 |只看该作者
原帖由 flw2 于 2008-3-10 20:42 发表
pthread_mutex_lock(&m);
while(!wait_condition)
    pthread_cond_wait(&v, &m);
/**/
pthread_mutex_unlock(&m);
在到达注释的那段代码的时候,那么wait_conditon == 0成立

但是如果把while改成if,那 ...


就是说在其他地方误用了pthread_cond_signal()或者同一个条件变量但不同断言的地方引用了pthread_cond_signal(),所以要在while中判断,相当于是“与”的关系
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP