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

南京浪人甲 2011-04-29 11:25:21
最近学习多线程,看了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)挪到互斥锁外面就可以了。我就是想问下,这个是什么原因呢?

...全文
198 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
likejieicy 2012-03-30
  • 打赏
  • 举报
回复
个人感觉把sleep放在锁外面才是对的
ken_yytd 2011-05-02
  • 打赏
  • 举报
回复
我觉得thread2在unlock与lock之间,若没有系统调用(如sleep等),一般其它线程是没有获得锁的机会了
南京浪人甲 2011-04-29
  • 打赏
  • 举报
回复
在我电脑上,运行的结果是 thread1一直无法获得互斥锁,你的意思是不是在其他电脑上会有不同的结果?[Quote=引用 2 楼 q191201771 的回复:]

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

这让我觉得,一个线程解锁后马上竞争互斥锁 ,貌似比其他线程更有优势。。。请高手指点
[/Quote]
就想叫yoko 2011-04-29
  • 打赏
  • 举报
回复
不存在优势
并行下, 线程被调用时间及执行时长看优先级看系统, 而锁嘛, 大家都一样[Quote=引用 1 楼 shanki_pm 的回复:]

这让我觉得,一个线程解锁后马上竞争互斥锁 ,貌似比其他线程更有优势。。。请高手指点
[/Quote]
南京浪人甲 2011-04-29
  • 打赏
  • 举报
回复
这让我觉得,一个线程解锁后马上竞争互斥锁 ,貌似比其他线程更有优势。。。请高手指点

3,881

社区成员

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

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