代码编译: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;
}