信號量


信號量相當於加強版的互斥鎖   mutex實現的同步是串行的,既能提供進程間的同步,還能提供線程間的同步

/*
    信號量的類型 sem_t
    int sem_init(sem_t *sem, int pshared, unsigned int value);
        - 初始化信號量
        - 參數:
            - sem : 信號量變量的地址
            - pshared : 0 用在線程間 ,非0 用在進程間
            - value : 信號量中的值

    int sem_destroy(sem_t *sem);
        - 釋放資源

    int sem_wait(sem_t *sem);
        - 對信號量加鎖,調用一次對信號量的值-1,如果值為0,就阻塞

    int sem_trywait(sem_t *sem);

    int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
    int sem_post(sem_t *sem);
        - 對信號量解鎖,調用一次對信號量的值+1

    int sem_getvalue(sem_t *sem, int *sval);

    sem_t psem;
    sem_t csem;
    init(psem, 0, 8);
    init(csem, 0, 0);

    producer() {
        sem_wait(&psem);
        sem_post(&csem)
    }

    customer() {
        sem_wait(&csem);
        sem_post(&psem)
    }

*/

   sem_post函數的作用是給信號量的值加上一個“1”,它是一個“原子操作”---即同時對同一個信號量做加“1”操作的兩個線程是不會沖突的;而同 時對同一個文件進行讀、加和寫操作的兩個程序就有可能會引起沖突。信號量的值永遠會正確地加一個“2”--因為有兩個線程試圖改變它。sem_wait函數也是一個原子操作,它的作用是從信號量的值減去一個“1”,但它永遠會先等待該信號量為一個非零值才開始做減法。也就是說,如果你對 一個值為2的信號量調用sem_wait(),線程將會繼續執行,介信號量的值將減到1。如果對一個值為0的信號量調用sem_wait(),這個函數就 會地等待直到有其它線程增加了這個值使它不再是0為止。如果有兩個線程都在sem_wait()中等待同一個信號量變成非零值,那么當它被第三個線程增加 一個“1”時,等待線程中只有一個能夠對信號量做減法並繼續執行,另一個還將處於等待狀態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM