条件变量的作用??请教

南京浪人甲 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一下),另一个线程就能获得锁,那还要用条件变量干嘛用呢?

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

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

哦,这么一说有点明白了:如果不用条件变量,要想让某两个互斥的线程其中某一个先访问共享资源的话,就得先sleep一个,否则无法判断哪个线程先执行;而如果使用了条件变量,就可以不用sleep而让某一特定线程先执行了,这么理解对吗?会不会有些片面?
nostopstep 2011-05-23
  • 打赏
  • 举报
回复
那如果两个线程需要同时访问一个资源呢?或者一个线程正在对一个全局信息进行操作的时候,另外一个线程也开始对其操作了呢?
锁或者条件变量的作用很重要呢,特别是多线程并发运行的时候。
对线程的概念好好理解一下。
小男孩尼克是个中学生,他每天都用手机和朋友通电话,发信息,上网。而且还从网上下载手机游戏来玩。 有一天,尼克从朋友那里听说,不光可以下载别人制作好的手机应用,而且还可以用一种叫做JAVA的东西来制作自己的手机应用程序。好奇心很强的尼克,真想马上就能自己制作应用程序,于是便去请教住在附近的精通手机应用和JAVA知识的JAVA博士…… 这可不是低幼读物哦,这是NEC-MobileFriend带给我们的手机JAVA入门讲座!适合所有人阅读,没有学习过编程也可以!只要你对自己编写手机游戏感兴趣! 这套讲座以小主人公尼克和JAVA博士对话的形式,配合丰富生动的插图,一步一步,由浅入深,由概念到实作地逐渐教会你手机JAVA开发的方方面面,本站强烈推荐! 讲座目录: 初级第一讲: 什么是JAVA? 介绍手机Java和编程的基础概念。 初级第二讲: 制作Java应用的环境 介绍如何制作Java应用的环境。 初级第三讲: 终端上运行 介绍JAVA的构造,并在终端上实际运行。 初级第四讲: 编程基础1 介绍编程里最重要的概念――变量和数据型。 初级第五讲: 编程基础2 介绍编程里最重要的概念――条件分歧和重复。 初级第六讲: 编程基础3 介绍编程里最重要的概念――排列和方法。 初级第七讲: 初级制图 -画图?` 介绍如何在终端上制作图画。 初级第八讲: 介绍如何使用终端的Key Button 介绍如何使用终端的Key Button 初级第九讲: 什么是object指向? 介绍object指向的相关知识。 初级第十讲: 动 画 介绍怎么使用动画使图像“动”起来。 初级第十一讲: 动画2 介绍Java程序里面的音乐。 初级第十二讲: 声 音 介绍使用动画制作简单的游戏程序。

3,881

社区成员

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

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