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