Linux多執行緒程式設計入門 同步機制 訊號量

2021-06-19 12:18:52 字數 1103 閱讀 3707

int sem_init(sem_t *sem, int pshared, unsigned int value);

pshared:控制訊號量的型別,0表示這個訊號量是當前程序的區域性訊號量,否則,這個訊號量就可以在多個程序之間共享。

value:訊號量的初始值。

int sem_post(sem_t *sem);以原子操作的方式給訊號量的值加1。這裡的原子操作指兩個執行緒企圖同時給乙個 訊號量加1,它們之間不會互相干擾。會正確的加為2.

int sem_wait(sem_t *sem);以原子操作的方式給訊號量的值減1。它會等待直到訊號量有乙個非零值才會開始減法操作。

int sem_destory(sem_t *sem); 清理訊號量所擁有的所有資源。

**如下:

#include #include #include #include #include #include void * thread_function(void * arg);

sem_t bin_sem;

#define work_size 1024

char work_area[work_size];

int main()

printf("\nwaiting for thread to finish...\n");

res = pthread_join(a_thread, &thread_result);

printf("thread joined\n");

sem_destroy(&bin_sem);

exit(exit_success);

}void * thread_function(void * arg)

pthread_exit(null);

}

解析:

初始化訊號量時,把它的值設定為0。這樣,在 執行緒函式啟動時,sem_wait函式呼叫就會阻塞並等待訊號量變為非零值。

主線程中,等待直到有文字輸入,然後呼叫sem_post增加訊號量的值,這將立即令另乙個執行緒從sem_wait的等待中返回並開始執行。在統計完字元個數之後,它再次呼叫sem_wait並再次被阻塞,直到主線程再次呼叫sem_post增加訊號量的值為止。

Linux同步機制 多執行緒開發總結

1 對於cpu開銷大的場景,能利用多核,就盡量利用多核 常常自以為某需求的運算量不大,且cpu足夠快,就偷懶寫個單執行緒,結果效率很低 2 使用多執行緒的時候,預設是加鎖的。在加鎖保證業務正常的條件下,再考慮優化互斥鎖帶來的效能損耗 互斥鎖 讀寫鎖 自旋鎖 無鎖 原子操作 3 減少執行緒之間的相關性...

多執行緒的同步機制

1 event 用事件 event 來同步執行緒是最具彈性的了。乙個事件有兩種狀態 激發狀態和未激發狀態。也稱有訊號狀態和無訊號狀態。事件又分兩種型別 手動重置事件和自動重置事件。手動重置事件被設定為激發狀態後,會喚醒所有等待的執行緒,而且一直保持為激發狀態,直到程式重新把它設定為未激發狀態。自動重...

Linux多執行緒程式設計(2)執行緒同步

執行緒同步 a.mutex 互斥量 多個執行緒同時訪問共享資料時可能會衝突,這跟前面講訊號時所說的可重要性是同樣的問 題。假如 兩個執行緒都要把某個全域性變數增加1,這個操作在某平台需要三條指令完成 1.從記憶體讀變數值到暫存器 2.暫存器的值加1 3.將暫存器的值寫回記憶體 我們通過乙個簡單的程式...