条件变量的作用??请教

南京浪人甲 2011-05-23 06:10:13
前一阵学习posix多线程,对互斥锁 和条件变量 有些了解了,可是最近突然有个困惑,就是条件变量的功能到底是什么,也就是说,只用互斥锁 与 同时用互斥锁和条件变量的区别在哪?
一段代码如下:


#include <stdio.h>
#include<pthread.h> //多线程所用头文件
#include <semaphore.h> //信号量使用头文件


pthread_cond_t g_cond /*=PTHREAD_MUTEX_INITIALIZER*/; //申明条锁,并用宏进行初始化
pthread_mutex_t g_mutex ;

//线程执行函数
void threadFun1(void)
{
int i;
pthread_mutex_lock(&g_mutex); //1
pthread_cond_wait(&g_cond,&g_mutex); //如g_cond无信号,则阻塞
for( i = 0;i < 2; i++ ){
printf("thread threadFun1.\n");
sleep(1);
}
pthread_cond_signal(&g_cond);
pthread_mutex_unlock(&g_mutex);
}


int main(void)
{
pthread_t id1; //线程的标识符
pthread_t id2;
pthread_cond_init(&g_cond,NULL); //也可以程序里面初始化
pthread_mutex_init(&g_mutex,NULL); //互斥变量初始化

int i,ret;
ret = pthread_create(&id1,NULL,(void *)threadFun1, NULL);
if ( ret!=0 ) { //不为0说明线程创建失败
printf ("Create pthread1 error!\n");
return (1);
}

sleep(5); //等待子线程先开始

pthread_mutex_lock(&g_mutex); //2
pthread_cond_signal(&g_cond); //给个开始信号,注意这里要先等子线程进入等待状态在发信号,否则无效
printf("do something\n");
pthread_mutex_unlock(&g_mutex);


pthread_join(id1,NULL);

pthread_cond_destroy(&g_cond); //释放
pthread_mutex_destroy(&g_mutex); //释放

return 0;
}


代码的工作流程我是可以了理解的,但是如果把条件变量去掉,也就是下面的代码:

#include <stdio.h>
#include<pthread.h> //多线程所用头文件
#include <semaphore.h> //信号量使用头文件


pthread_cond_t g_cond /*=PTHREAD_MUTEX_INITIALIZER*/; //申明条锁,并用宏进行初始化
pthread_mutex_t g_mutex ;

//线程执行函数
void threadFun1(void)
{
int i;
pthread_mutex_lock(&g_mutex); //1
//pthread_cond_wait(&g_cond,&g_mutex); //如g_cond无信号,则阻塞
for( i = 0;i < 2; i++ ){
printf("thread threadFun1.\n");
sleep(5);
}
pthread_cond_signal(&g_cond);
pthread_mutex_unlock(&g_mutex);
}


int main(void)
{
pthread_t id1; //线程的标识符
pthread_t id2;
pthread_cond_init(&g_cond,NULL); //也可以程序里面初始化
pthread_mutex_init(&g_mutex,NULL); //互斥变量初始化

int i,ret;
ret = pthread_create(&id1,NULL,(void *)threadFun1, NULL);
if ( ret!=0 ) { //不为0说明线程创建失败
printf ("Create pthread1 error!\n");
return (1);
}

sleep(3); //等待子线程先开始

pthread_mutex_lock(&g_mutex); //2
printf("do something\n");
//pthread_cond_signal(&g_cond); //给个开始信号,注意这里要先等子线程进入等待状态在发信号,否则无效
pthread_mutex_unlock(&g_mutex);


pthread_join(id1,NULL);

pthread_cond_destroy(&g_cond); //释放
pthread_mutex_destroy(&g_mutex); //释放

return 0;
}


我的意思是,反正一个线程解锁(可能要再sleep一下),另一个线程就能获得锁,那还要用条件变量干嘛用呢?

...全文
278 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
南京浪人甲 2011-05-24
  • 打赏
  • 举报
回复
自己再顶一下!
南京浪人甲 2011-05-24
  • 打赏
  • 举报
回复
难道就没人再回复了吗???
南京浪人甲 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nostopstep 的回复:]

那如果两个线程需要同时访问一个资源呢?或者一个线程正在对一个全局信息进行操作的时候,另外一个线程也开始对其操作了呢?
锁或者条件变量的作用很重要呢,特别是多线程并发运行的时候。
对线程的概念好好理解一下。
[/Quote]

哦,这么一说有点明白了:如果不用条件变量,要想让某两个互斥的线程其中某一个先访问共享资源的话,就得先sleep一个,否则无法判断哪个线程先执行;而如果使用了条件变量,就可以不用sleep而让某一特定线程先执行了,这么理解对吗?会不会有些片面?
nostopstep 2011-05-23
  • 打赏
  • 举报
回复
那如果两个线程需要同时访问一个资源呢?或者一个线程正在对一个全局信息进行操作的时候,另外一个线程也开始对其操作了呢?
锁或者条件变量的作用很重要呢,特别是多线程并发运行的时候。
对线程的概念好好理解一下。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧