现在的位置: 首页 > 综合 > 正文

生产者消费者实现

2018年05月08日 ⁄ 综合 ⁄ 共 2302字 ⁄ 字号 评论关闭

代码编译:gcc main.c -o test -lpthread

代码跑起来是这个样子的:

源代码:

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define MAX_DATA_NUM  (10)

typedef struct tagObject
{
	int iData;
	pthread_cond_t  stCond;
	pthread_mutex_t stMutex;	
}OBJECT;

OBJECT *createObject(void);
void releaseObject(OBJECT **ppObject);
void *producerEntry(void *pData);
void *consumerEntry(void *pData);

int main(int argc, char *argv[])
{
	OBJECT *pObject = NULL;
	pthread_t pid, cid;

	pObject = createObject();
	if (NULL == pObject)
	{
		printf("Failed to create object.\r\n");
		return -1;
	}

	pthread_create(&pid, NULL, producerEntry, pObject);
	pthread_create(&cid, NULL, consumerEntry, pObject);

	pthread_join(pid, NULL);
	pthread_join(cid, NULL);

	releaseObject(&pObject);

	return 0;
}

OBJECT *createObject(void)
{
	int iRet = 0;
	OBJECT *pObject = NULL;

	pObject = (OBJECT *)malloc(sizeof(OBJECT));
	if (NULL == pObject)
	{
		printf("Failed to create object.\r\n");
		return NULL;
	}

	iRet = pthread_cond_init(&(pObject->stCond), NULL);
	if (0 != iRet)
	{		
		printf("Failed to create condition.\r\n");
		free(pObject);

		return NULL;
	}

	iRet = pthread_mutex_init(&(pObject->stMutex), NULL);
	if (0 != iRet)
	{
		printf("Failed to create mutex.\r\n");
		pthread_cond_destroy(&(pObject->stCond));
		free(pObject);

		return NULL;
	}	

	return pObject;
}

void releaseObject(OBJECT **ppObject)
{
	OBJECT *pObject = NULL;

	assert(NULL != ppObject);
	pObject = *ppObject;


	if (NULL != *ppObject)
	{
		pthread_mutex_destroy(&(pObject->stMutex));
		pthread_cond_destroy(&(pObject->stCond));
		free(pObject);

		*ppObject = NULL;
	}
}

void *producerEntry(void *pData)
{
	int i;
	OBJECT *pObject = NULL;

	assert(NULL != pData);
	pObject = (OBJECT *)pData;

	for (i = 1; i < MAX_DATA_NUM; i++)
	{
		pthread_mutex_lock(&(pObject->stMutex));
		while(0 != pObject->iData)
		{
			pthread_cond_wait(&(pObject->stCond), &(pObject->stMutex));
		}
		pObject->iData = i;
		printf("Produce product (%d)\r\n", pObject->iData);
		pthread_mutex_unlock(&(pObject->stMutex));

		pthread_cond_signal(&(pObject->stCond));
	}

	printf("Producer finished.\r\n");
	pthread_cond_signal(&(pObject->stCond));
	
	return NULL;
}

void *consumerEntry(void *pData)
{
	int i;
	OBJECT *pObject = NULL;

	assert(NULL != pData);
	pObject = (OBJECT *)pData;

	for (i = 1; i < MAX_DATA_NUM; i++)
	{
		pthread_mutex_lock(&(pObject->stMutex));
		while(0 == pObject->iData)
		{
			pthread_cond_wait(&(pObject->stCond), &(pObject->stMutex));
		}

		printf("\tConsume product (%d)\r\n", pObject->iData);
		pObject->iData = 0;
		pthread_mutex_unlock(&(pObject->stMutex));

		pthread_cond_signal(&(pObject->stCond));
	}

	printf("Consumer finished.\r\n");

	return NULL;
}

抱歉!评论已关闭.