新手,pthread_cond_wait的使用求高手解答

yanbiao1 发布于 2014/03/21 18:17
阅读 143
收藏 0
#include<pthread.h>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
static pthread_mutex_t mtx=PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
struct node
{
	int n_number;
	struct node* n_next;
}* head=NULL;
static void cleanup_handler(void *arg)
{
	printf("Cleanuphandlerofsecondthread.\n");
	free(arg);
	pthread_mutex_unlock(&mtx);
}
static void *thread_func(void *arg)
{
	struct node *p=NULL;
	pthread_cleanup_push(cleanup_handler,p);
	while(1)
	{
		pthread_mutex_lock(&mtx);
		while(head!=NULL)
		{
			pthread_cond_wait(&cond,&mtx);
			p=head;
			head=head->n_next;
			printf("Got%dfromfrontofqueue\n",p->n_number);
			free(p);
		}
		pthread_mutex_unlock(&mtx);
	}
	pthread_cleanup_pop(0);
}
int main(void)
{
	pthread_t tid;
	int i;
	struct node *p;
	pthread_create(&tid,NULL,thread_func,NULL);
	for(i=1;i<10;i++)
	{
		p=(struct node*)malloc(sizeof(struct node));
		p->n_number=i;
		pthread_mutex_lock(&mtx);
		p->n_next=head;
		head=p;
		pthread_cond_signal(&cond);
		pthread_mutex_unlock(&mtx);
		sleep(2);
	}
	printf("thread1wannaendthecancelthread2.\n");
	pthread_cancel(tid);
	pthread_join(tid,NULL);
	printf("ALLdone--exiting\n");
	return 0;	
}

为什么main函数中for循环是从1到9,但显示的结果却是从2到9,求高手解答



加载中
0
阿注哥
阿注哥
pthread_cond_signal是边沿触发,所以 pthread_cond_wait要先进入才行。
y
yanbiao1
明白了,while(head!=NULL)条件导致一开始 线程没进入等待的队列
返回顶部
顶部