当前位置: 技术问答>linux和unix
pthread_cond_wait 不阻塞?
来源: 互联网 发布时间:2017-03-02
本文导语: 请教为什么下面的程序,在pthread_cond_wait这不阻塞呢。 #include #include #include #include #include #include #include #include // 读写互斥体 pthread_mutex_t mutexWriteRead = PTHREAD_MUTEX_INITIALIZER; // 读条件变量 pthread_cond_t condW...
请教为什么下面的程序,在pthread_cond_wait这不阻塞呢。
#include
#include
#include
#include
#include
#include
#include
#include
// 读写互斥体
pthread_mutex_t mutexWriteRead = PTHREAD_MUTEX_INITIALIZER;
// 读条件变量
pthread_cond_t condWrote = PTHREAD_COND_INITIALIZER;
int main(int args, const char *argc[])
{
// 如果 要写位置是待读位置 的话,则
int dwRet =0;
do
{
pthread_mutex_lock( &mutexWriteRead );
dwRet=pthread_cond_wait(&condWrote, &mutexWriteRead ); //应当阻塞在此,但没有
if( EINVAL == dwRet )
{
printf("== EINVALn");
}
else
{
printf("end wait %dn",dwRet);
}
}
while(1);
}
在ubuntu上运行此程序,结果如下:pthread_cond_waint根本没有阻塞,它的返回值为0说明它是接收到了信号,但这个信号从什么地方来的呢。
end wait 0
end wait 0
end wait 0
end wait 0
...
#include
#include
#include
#include
#include
#include
#include
#include
// 读写互斥体
pthread_mutex_t mutexWriteRead = PTHREAD_MUTEX_INITIALIZER;
// 读条件变量
pthread_cond_t condWrote = PTHREAD_COND_INITIALIZER;
int main(int args, const char *argc[])
{
// 如果 要写位置是待读位置 的话,则
int dwRet =0;
do
{
pthread_mutex_lock( &mutexWriteRead );
dwRet=pthread_cond_wait(&condWrote, &mutexWriteRead ); //应当阻塞在此,但没有
if( EINVAL == dwRet )
{
printf("== EINVALn");
}
else
{
printf("end wait %dn",dwRet);
}
}
while(1);
}
在ubuntu上运行此程序,结果如下:pthread_cond_waint根本没有阻塞,它的返回值为0说明它是接收到了信号,但这个信号从什么地方来的呢。
end wait 0
end wait 0
end wait 0
end wait 0
...
|
一般都是要这么用的:
pthread_mutex_lock(&m);
while(!wait_condition)
pthread_cond_wait(&v, &m);
pthread_mutex_unlock(&m);
只有这样才保险,因为有时候是虚假返回。
pthread_mutex_lock(&m);
while(!wait_condition)
pthread_cond_wait(&v, &m);
pthread_mutex_unlock(&m);
只有这样才保险,因为有时候是虚假返回。