訊號量和互斥量C語言示例理解執行緒同步

2021-07-24 18:38:34 字數 2239 閱讀 7550

2. 參考資料

了解執行緒訊號量的基礎知識,對深入理解python的執行緒會大有幫助。

當兩個執行緒同時執行時,不可避免同時操作同乙個變數或者檔案等,所以需要有一組機制來確保他們能正確的執行:訊號量和互斥量。訊號量可以分為最簡單的「二進位制訊號量」和更通用的「計數訊號量」。訊號量通常用來保護一段**,使其每次只能被乙個執行執行緒執行,這種情況下需要用到二進位制訊號量。有時候希望可以允許有限數目的執行緒執行一段指定**,這就需要用到計數訊號量。實際上,技術訊號量是一種二進位制訊號量的邏輯擴充套件,實際兩者呼叫的函式一樣。

互斥量和訊號量很相似,事實上他們可以互相通過對方來實現。但在實際應用中,對於一些情況使用其中一種更符合語義而且效果更好。

#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()

res = pthread_create(&a_thread, null, thread_function, null); /* 建立新執行緒 */

if (res != 0)

printf("inout some text, enter 'end' to finish\n");

while(strncmp("end", work_area, 3) != 0)

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

res = pthread_join(a_thread, &thread_result); /* 等待執行緒結束 */

if (res != 0)

printf("thread joined\n");

sem_destroy(&bin_sem); /* 銷毀訊號量 */

exit(exit_success);

}void *thread_function(void *arg)

pthread_exit(null);

}

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

pthread_mutex_t work_mutex;

#define work_size 1024

char work_area[work_size];

int time_to_exit = 0; /* 用來控制是否退出*/

int main()

res = pthread_create(&a_thread, null, thread_function, null); /* 建立乙個新執行緒 */

if (res != 0)

pthread_mutex_lock(&work_mutex); /* 嘗試對互斥量加鎖 */

printf("input some text, enter 'end' to finish\n");

while(!time_to_exit)

else

}} pthread_mutex_unlock(&work_mutex);

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

res = pthread_join(a_thread, &thread_result);

if (res != 0)

printf("thread joined\n");

pthread_mutex_destroy(&work_mutex);

exit(exit_success);

}void *thread_function(void *arg)

} time_to_exit = 1; /* 當輸入end後,設定退出標誌 */

work_area[0] = '\0';

pthread_mutex_unlock(&work_mutex);

pthread_exit(0);

}

訊號量和互斥量

1.互斥量用於執行緒的互斥,訊號線用於執行緒的同步。這是互斥量和訊號量的根本區別,也就是互斥和同步之間的區別。互斥 是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。同步 是指在互斥的基礎上 大多數情況 通過其它機制實現訪問者對資...

訊號量 互斥量

lonelycatcher if only as first.來自 訊號量用在多執行緒多工同步的,乙個執行緒完成了某乙個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作 大家都在semtake的時候,就阻塞在 而互斥鎖是用在多執行緒多工互斥的,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法...

RTX 互斥量 和 訊號量

互斥量 如果乙個任務獲得資源以後沒有釋放,下次執行時候這個任務本身不必再等待,直接擁有這個資源的使用權,但別的任務要使用只能等待。訊號量 假設初始化時只有1個資源可以使用,那麼乙個任務獲得資源以後沒有釋放,下次想再呼叫 就算是之前呼叫的這個任務也 必須等待。這是訊號量和互斥量的區別之一,之二是互斥量...