当前位置: 技术问答>linux和unix
关于pthread_cond_wait函数
来源: 互联网 发布时间:2016-07-10
本文导语: 大家好: 这几天刚开始接触多线程编程,有一些问题不太会,还望请高手指点下小弟啊,谢了。 1. pthread_cond_wait函数需要条件变量和互斥量两个参数,但是唤醒线程的pthread_cond_signal函数只传了一个条件...
大家好:
这几天刚开始接触多线程编程,有一些问题不太会,还望请高手指点下小弟啊,谢了。
1. pthread_cond_wait函数需要条件变量和互斥量两个参数,但是唤醒线程的pthread_cond_signal函数只传了一个条件变量,那么是不是就说明在调用pthread_cond_signal之前,要被激活的线程必须锁住互斥量才行啊?
2. 我编了一个小函数在主函数里创建了一个线程,然后让新创建的线程等待。然后检验输入的整数如果是偶数,则启动创建的线程,那么对这个线程的函数pthread_cond_wait里的互斥量参数应该怎么处理啊,先把它锁住吗?
这几天刚开始接触多线程编程,有一些问题不太会,还望请高手指点下小弟啊,谢了。
1. pthread_cond_wait函数需要条件变量和互斥量两个参数,但是唤醒线程的pthread_cond_signal函数只传了一个条件变量,那么是不是就说明在调用pthread_cond_signal之前,要被激活的线程必须锁住互斥量才行啊?
2. 我编了一个小函数在主函数里创建了一个线程,然后让新创建的线程等待。然后检验输入的整数如果是偶数,则启动创建的线程,那么对这个线程的函数pthread_cond_wait里的互斥量参数应该怎么处理啊,先把它锁住吗?
|
1.调用pthread_cond_signal之前,要被激活的线程必须锁住互斥量才行啊?
是的,否则很可能由于系统调度的关系,导致你的pthread_cond_wait的线程(一般都会有个while判断条件是否满足)会再次调用阻塞在pthread_cond_wait,导致永远失去被唤醒的机会。
2.给你个例子
int count=0;
线程
pthread_mutex_lock(&count_lock);
while(count==0){
pthread_cond_wait(&count_nonzero, &count_lock);
}
pthread_mutex_unlock (&count_lock);
唤醒线程
pthread_mutex_lock(&count_lock);
if(count==0)
pthread_cond_signal(&count_nonzero);
count++;
pthread_mutex_unlock(&count_lock);
}
是的,否则很可能由于系统调度的关系,导致你的pthread_cond_wait的线程(一般都会有个while判断条件是否满足)会再次调用阻塞在pthread_cond_wait,导致永远失去被唤醒的机会。
2.给你个例子
int count=0;
线程
pthread_mutex_lock(&count_lock);
while(count==0){
pthread_cond_wait(&count_nonzero, &count_lock);
}
pthread_mutex_unlock (&count_lock);
唤醒线程
pthread_mutex_lock(&count_lock);
if(count==0)
pthread_cond_signal(&count_nonzero);
count++;
pthread_mutex_unlock(&count_lock);
}
|
下面是使用函数pthread_cond_wait()和函数pthread_cond_signal()的一个简单的例子。
pthread_mutex_t count_lock;
pthread_cond_t count_nonzero;
unsigned count;
decrement_count()
{
pthread_mutex_lock (&count_lock);
while(count==0)
pthread_cond_wait( &count_nonzero, &count_lock);
count=count -1;
pthread_mutex_unlock (&count_lock);
}
increment_count()
{
pthread_mutex_lock(&count_lock);
if(count==0)
pthread_cond_signal(&count_nonzero);
count=count+1;
pthread_mutex_unlock(&count_lock);
}
count值为0时,decrement函数在pthread_cond_wait处被阻塞,并打开互斥锁count_lock。此时,当调用到函数 increment_count时,pthread_cond_signal()函数改变条件变量,告知decrement_count()停止阻塞。
pthread_mutex_t count_lock;
pthread_cond_t count_nonzero;
unsigned count;
decrement_count()
{
pthread_mutex_lock (&count_lock);
while(count==0)
pthread_cond_wait( &count_nonzero, &count_lock);
count=count -1;
pthread_mutex_unlock (&count_lock);
}
increment_count()
{
pthread_mutex_lock(&count_lock);
if(count==0)
pthread_cond_signal(&count_nonzero);
count=count+1;
pthread_mutex_unlock(&count_lock);
}
count值为0时,decrement函数在pthread_cond_wait处被阻塞,并打开互斥锁count_lock。此时,当调用到函数 increment_count时,pthread_cond_signal()函数改变条件变量,告知decrement_count()停止阻塞。
|
是的、、、
increment_count() 可以不是、
increment_count() 可以不是、
|
贴个你不理解的代码,然后把疑惑的地方标记出来,有代码比较好说一些,说实话,我没看明白你这个回复的意思
|
pthread_cond_wait(*cond, *mutex);
上面是pthread_cond_wait函数的原型,这个函数要返回的条件就是要有其它线程signal这个cond并unlock这个mutex, 所以其它线程只signal这个cond而没有unlock这个mutex的话,你的pthread_cond_wait不会返回.
上面是pthread_cond_wait函数的原型,这个函数要返回的条件就是要有其它线程signal这个cond并unlock这个mutex, 所以其它线程只signal这个cond而没有unlock这个mutex的话,你的pthread_cond_wait不会返回.
|
mark
|
http://topic.csdn.net/u/20091011/12/89b61519-d822-4908-9bdb-4a8891a78854.html
在这贴中回过了,楼主可以参考一下
在这贴中回过了,楼主可以参考一下