執行緒——生產者與消費者1.0
阿新 • • 發佈:2019-01-12
#include <stdio.h> #include <pthread.h> #include <semaphore.h> #include <string.h> // 定義結構體變數 // 全域性資料 struct _data { // 緩衝區中的資料 char buf[20]; // 控制消費者進入 sem_t full; // 控制生產者進入 sem_t empty; }data; // 生產者工作函式 void *producer(void *v) { char *buf[] = {"蘋果", "梨", "波羅蜜", "山竹"}; int len = sizeof(buf) / sizeof(buf[0]); while(1) { // 生產者只有當緩衝區為空的時候才能進入 sem_wait(&data.empty); usleep(100000*(rand()%10+1)); strcpy(data.buf, buf[rand()%len]); // 生產者放入訊息以後,通知消費者去處理 sem_post(&data.full); } } // 消費者工作函式 void *customer (void *v) { long num = (long)v; while(1) { // 消費者只有當緩衝區中有資料的時候才能進入 sem_wait(&data.full); usleep(100000*(rand()%10+1)); printf ("%ld 消費者吃了一個 %s\n", num, data.buf); data.buf[0] = '\0'; // 消費者處理完資料以後,通知生產者去放資料 sem_post(&data.empty); } } // 生產者與消費者 int main() { srand((unsigned int)time(NULL)); pthread_t thread; long i; for (i = 0; i < 4; i++) { pthread_create(&thread, NULL, customer, (void *)(i+1)); pthread_detach(thread); } pthread_create(&thread, NULL, producer, NULL); pthread_detach(thread); // int sem_init(sem_t *sem, int pshared, unsigned int value); sem_init(&data.full, 0, 0); sem_init(&data.empty, 0, 1); pthread_exit(NULL); return 0; }