執行緒——條件變數
阿新 • • 發佈:2019-01-13
#include <stdio.h> #include <pthread.h> #include <semaphore.h> #include <string.h> // 初始化互斥量 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 條件變數 pthread_cond_t cond1; // 資源 int source; // 生產者 void *producer(void *v) { while(1) { usleep(100000*(rand()%10+1)); pthread_mutex_lock(&mutex); source += 2; pthread_mutex_unlock(&mutex); // 廣播 pthread_cond_broadcast(&cond1); } } // 消費者 void *customer (void *v) { long num = (long)v; while(1) { // 為什麼要有迴圈 // 因為當執行緒被喚醒的時候,有可能條件還是不滿足的,所以還需要判斷一次 // 1、當等待的時候,會自動解鎖 // 2、當被喚醒的時候,會和其他執行緒一起搶鎖 usleep(100000*(rand()%10+1)); pthread_mutex_lock(&mutex); while (source <= 0) { pthread_cond_wait(&cond1, &mutex); } source--; printf ("%ld消費者消費,剩餘個數%d\n", num, source); pthread_mutex_unlock(&mutex); } } // 生產者與消費者 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); // pthread_cond_init(pthread_cond_t *cond,const pthread_condattr_t *attr); // 條件變數的初始化 pthread_cond_init(&cond1, NULL); pthread_exit(NULL); return 0; }