首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

多线程 互斥锁 以及 条件变量的有关问题【新手】

2013-01-05 
多线程 互斥锁 以及 条件变量的问题【新手】最近学习多线程,看了http://blog.csdn.net/benny_cen/archive/20

多线程 互斥锁 以及 条件变量的问题【新手】
最近学习多线程,看了http://blog.csdn.net/benny_cen/archive/2009/03/09/3972903.aspx的帖子,然后运行他给的代码:


/*condmutex.c*/
#include <stdlib.h>  
#include <stdio.h>  
#include <pthread.h>  
#include <errno.h>   
/*全局变量*/
int gnum = 0;
/*互斥量 */
pthread_mutex_t mutex;
/*条件变量*/
pthread_cond_t  cond;
/*声明线程运行服务程序*/
static void pthread_func_1 (void);   
static void pthread_func_2 (void);   
int main (void)   
{   
/*线程的标识符*/
pthread_t pt_1 = 0;   
pthread_t pt_2 = 0;   
int ret = 0;   

/*互斥初始化*/
pthread_mutex_init (&mutex, NULL); 
/*条件变量初始化*/
pthread_cond_init(&cond,NULL);
/*分别创建线程1、2*/
ret = pthread_create (&pt_1,//线程标识符指针
NULL,//默认属性
(void *)pthread_func_1,//运行函数
NULL);   //无参数
if (ret != 0)   
{   
perror ("pthread_1_create");   
}   

ret = pthread_create (&pt_2, //线程标识符指针
NULL,//默认属性
(void *)pthread_func_2, //运行函数
NULL);   //无参数
if (ret != 0)   
{   
perror ("pthread_2_create");   
}   
/*等待线程1、2的结束*/
pthread_join (pt_1, NULL);   
pthread_join (pt_2, NULL);   

printf ("main programme exit!\n");  
return 0;   
}   
/*线程1的服务程序*/
static void pthread_func_1 (void)   
{   
int i = 0;   

for (;;)   
{   
printf ("This is pthread1!\n");    
pthread_mutex_lock(&mutex); /*获取互斥锁*/
/*注意,这里以防线程的抢占,以造成一个线程在另一个线程sleep时多次访问互斥资源,所以sleep要在得到互
斥锁后调用*/
sleep (1);
/*条件变量,当gnum<=3时,线程1自己挂起并且解锁,让线程2进去*/
while (gnum <= 3) {
pthread_cond_wait(&cond, &mutex);
}
/*当线程2调用pthread_cond_signal(&cond)时,线程1在这里重启*/
/*临界资源*/
gnum++;
printf ("Thread1 add one to num:%d\n",gnum);
pthread_mutex_unlock(&mutex); /*释放互斥锁*/



}   
}   
/*线程2的服务程序*/ 
static void pthread_func_2 (void)   
{   
int i = 0;   

for (;;)   
{   
printf ("This is pthread2!\n"); 
pthread_mutex_lock(&mutex); /*获取互斥锁*/
/*注意,这里以防线程的抢占,以造成一个线程在另一个线程sleep时多次访问互斥资源,所以sleep要在得到互
斥锁后调用*/
sleep (1);
/*临界资源*/
gnum++;
printf ("Thread2 add one to num:%d\n",gnum);
/*当gnum == 4时,触发*/
if (gnum == 4) 
pthread_cond_signal(&cond);

pthread_mutex_unlock(&mutex); /*释放互斥锁*/

}   

pthread_exit (0);   
}  


发现是不能实现功能的,然后把两个sleep(1)挪到互斥锁外面就可以了。我就是想问下,这个是什么原因呢?


------解决方案--------------------


不存在优势
并行下, 线程被调用时间及执行时长看优先级看系统, 而锁嘛, 大家都一样

引用:
这让我觉得,一个线程解锁后马上竞争互斥锁 ,貌似比其他线程更有优势。。。请高手指点

[解决办法]
我觉得thread2在unlock与lock之间,若没有系统调用(如sleep等),一般其它线程是没有获得锁的机会了

热点排行