為保證每個線程對同一資源訪問有效,比如一個線程想要從共享資源讀數據,而這些資源正在被其他線程修改,那么讀出來的數據是無效的,那么就要想辦法讓其他線程修改完再去讀,這時候就用到了同步機制。可以使用Linux系統提供的機制來對線程訪問資源的順序進行同步,本文檔挑選了信號量,互斥鎖,條件變量來介紹線程同步機制,實驗代碼在sync/目錄下。 1 POSIX無名信號量 本章介紹POSIX 無名信號量,以下簡稱信號量。信號量類似于計數器,操作方法和前面的System V 信號燈基本一樣。 使用信號量的步驟: 1.在程序全局區定義信號量; 2.使用seminit()初始化信號量; 3.使用sem_wait()和sem_post()對信號量進行P/V操作; 4.使用sem_destroy()銷毀信號量。 信號量常用函數如下: sem_init():對信號量值進行初始化, #include int sem_init(sem_t *sem, int pshared, unsigned int value); 參數含義: sem:指針,指向定義的信號量; pshared:指明這個信號量用于進程還是線程,0為線程,不等于0為進程,本節填寫為0。 value:信號量初始值 返回值:成功返回0,錯誤返回-1。 sem_wait():等待一個信號量,進行P操作,信號量值-1; sem_post():喚醒一個信號量,進行V操作,信號量值+1,定義如下: #include int sem_wait(sem_t *sem); int sem_post(sem_t *sem); 參數含義: sem:要操作的信號量; 返回值:成功返回0,錯誤返回-1。 sem_destroy():銷毀初始化后的信號量 #include int sem_destroy(sem_t *sem); sem:要操作的信號量; 返回值:成功返回0,錯誤返回-1。 實驗代碼在sync/sem.c:路徑為:11_Linux系統開發進階\Linux系統編程_章節使用資料。 使用信號量控制讀寫線程,初始化時寫信號量為1,讀信號量為0,那么讀線程就會阻塞,寫線程就會執行并將寫信號-1,寫線程在fgets等待輸入,當輸入完成后,將讀信號+1喚醒讀線程,這樣讀寫線程交替執行就完成了同步。 ![]() ![]() ![]() |