1. 程式人生 > >【Linux】條件變數與訊號量

【Linux】條件變數與訊號量

    1.定義訊號量 sem_t sem;
    2.初始化訊號量 int sem_init(sem_t *sem, int pshared, unsigned int value);
                a. sem地址    b. 0表示本程序中多個執行緒間同步,非0表示可以跨程序的同步操作。c. 訊號量初值(計數器的值)
    3.PV操作
        P   int sem_wait(sem_t *sem);   // sem-1 如果小於0就阻塞
        V    int sem_post(sem_t *sem);   // sem+1
    4.銷燬 int sem_destroy(sem_t *sem);
    
    倉庫存放東西有限
        生產者
        
        while (1)
        {
            pthread_mutex_lock();
            sem_wait(sem_full);
            生產
            sem_post(sem_empty);
            pthread_mutex_unlock();
        }
        
        消費者
        
        while (1)
        {
            pthread_mutex_lock();
            sem_wait(sem_empty);
            消費
            sem_post(sem_full);
            pthread_mutex_unlock();
        }
        
    場景:http伺服器是基於短連線的,那麼在網頁上的訪問就會頻繁地建立和銷燬執行緒,這樣開銷是很大的。
執行緒池(生產者消費者模型)
    根據系統性能建立合適大小的執行緒池。
    將建立的執行緒存入線上程池中,需要執行緒時,就讓它們建立聯絡,不想用了,就斷開聯絡。
    
        1.執行緒池中有若干個執行緒
        2.用於執行大量相對短暫的任務
    
    計算密集型任務:大量的時間佔用CPU進行運算。   
        執行緒池中執行緒的個數等於CPU個數,避免執行緒切換。
    IO密集型任務:大量的時間佔用CPU在阻塞等待IO。    
        執行緒池中執行緒個數大於CPU個數。
    
    當任務增加時,可以動態增加執行緒池中執行緒的個數。當任務執行完成後,可以動態減少執行緒池中執行緒個數。
    
    需求:
        生產者執行緒向任務佇列中新增任務,任務佇列中有任務,如果執行緒池中有等待執行緒就喚醒它並執行任務,如果執行緒池中沒有
    等待執行緒,並且沒有達到上限,就新增新的執行緒到執行緒池。
        沒有任務執行就等待,有任務則去執行。
    
        typedef struct condition
        {
            pthread_mutex_t mutex;
            pthread_cond_t cond;
        }condition_t;
        
        // 任務佇列
        typedef struct task
        {
            void *(pfun)(void *); // 任務佇列的回撥函式(管理任務的)
            void *arg; // 回撥函式傳入的引數
            struct task *next;
        }task_t;
        
        typedef struct threadpool
        {
            condition_t cond; // 同步與互斥
            task_t *first; // 任務佇列的隊頭
            task_t *tail; // 任務佇列的隊尾
            int max_thread; // 最大執行緒個數
            int idle; // 空閒執行緒個數   如果有空閒執行緒,此時可以signal通知下
            int counter; // 當前執行緒池中的執行緒個數
            int quit;    // 如果為1表示退出,為0表示不退出
        }threadpool_t;
    
        // 初始化
        void threadpool_init(threadpool_t *pool, int max);
        // 往執行緒池新增任務
        void threadpool_add(threadpool_t *pool, void*(*pf)(void*), void *arg);
        // 銷燬執行緒池
        void threadpool_destroy(threadpool_t *pool);
        
        
        pthread_cond_broadcast();   // 喚醒所有
        pthread_cond_signal();   // 只喚醒一個
--------------------- 
作者:sustzc 
來源:CSDN 
原文:https://blog.csdn.net/sustzc/article/details/82734994 
版權宣告:本文為博主原創文章,轉載請