条件变量使用问题

whdugh 2016-07-31 02:19:37
在看卷2进程间通信条件变量一章,代码如下:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

#define MAXNITEMS 10000
#define MAXNTHREADS 100

/**************global shared by threads*********/
int nitems;//read-only by produces and consumer
int buf[MAXNITEMS];

//生产者变量和互斥锁收集到一个结构中
struct{
pthread_mutex_t mutex;
int nput; //next index to store
int nval; //next value to store
}put = {PTHREAD_MUTEX_INITIALIZER};


//
struct{
pthread_mutex_t mutex;
pthread_cond_t cond;
int nready;//number ready for consumer
}nready = {
PTHREAD_MUTEX_INITIALIZER,PTHREAD_COND_INITIALIZER
};

int mymin(int a,int b)
{
return a>b?b:a;
}
void *produce(void *arg)
{
for (;;)
{
pthread_mutex_lock(&put.mutex);

//这里要加判断是否大于最大items数
if (put.nput > nitems)
{
pthread_mutex_unlock(&put.mutex);
//printf("超过最大items[%d]\n",nitems);
return NULL;
}

put.nput++;
put.nval++;
buf[put.nput] = put.nval;
pthread_mutex_unlock(&put.mutex);

pthread_mutex_lock(&nready.mutex);
if (nready.nready == 0) //
{
printf("thread produce signal 11\n");
pthread_cond_signal(&nready.cond);//条件满足唤醒consumer
printf("thread produce signal 22\n\n");
}

//if (buf[put.nput] >= 0)
{
nready.nready++; //什么时候加1???
}

pthread_mutex_unlock(&nready.mutex);

sleep(1);
}
}

void *consumer(void *arg)
{
//for (;;)
int i;
for (i = 0; i < nitems; ++ i)
{

{
pthread_mutex_lock(&nready.mutex);
//if (nready.nready <= 0)
while(nready.nready == 0) //
{
printf("thread consumer wait 111!\n");
pthread_cond_wait(&nready.cond,&nready.mutex);//等待条件满足
printf("thread consumer wait 22!\n\n");
}
printf("nready.nready = %d\n",nready.nready);
nready.nready--;
pthread_mutex_unlock(&nready.mutex);



sleep(1);

}
}
return NULL;
}

int main(int argc,char *argv[])
{
pthread_t tid_produces[MAXNTHREADS],tid_consumer;
int i;
int nthreads;
int count[MAXNTHREADS];


if (argc !=3)
{
printf("usage:produces<#items><#threads>");
exit(-1);
}

nitems = mymin(atoi(argv[1]),MAXNITEMS);
nthreads = mymin(atoi(argv[2]),MAXNTHREADS);


for (i = 0 ; i < nthreads;++i)
{
pthread_create(&tid_produces[i],NULL,produce,NULL);
}
pthread_create(&tid_consumer,NULL,consumer,NULL);

//等待线程被执行
for (i = 0 ; i < nthreads;++i)
{
pthread_join(tid_produces[i],NULL);
}
pthread_join(tid_consumer,NULL);

return 0;
}



上面的源码和书上一致,程序运行发现,如果线程produce先执行的话,if条件满足调用pthread_cond_signal,nready++,然后consume线程等不到while条件满足,直接nready--,然后线程produce这边又调用signal,这样是不是有问题啊
...全文
290 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
huawang99 2016-08-03
  • 打赏
  • 举报
回复
你上面的程序是这样的逻辑: t1: produce线程,先发送signal,然后nready++变为1,最后进入sleep(1); t2. consume线程启动后,发现nready为1,直接跳过while循环,执行nready--变为0,然后进入sleep(1); t3: produce线程,sleep(1)结束,重复t1步骤 t4: consume线程,重复t2步骤。

23,118

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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