一:為什麼要用多執行緒?
避免阻塞:乙個程序如果只有乙個執行緒的話,當這個乙個執行緒阻塞則就整個程序阻塞,無法再去完成其他事情。
提高效率,避免cpu空**程式經常涉及讀寫操作就會訪問磁碟,這些操作的速度比cpu慢的多,而為了等待這些操作的響應,cpu又不能去幹其他的事情或者處理新的請求,導致這種單執行緒的程式效能差。而多執行緒會共享同一位址空間,執行緒的切換比程序快。
二:linux提供執行緒同步的方式:
(一):互斥鎖(mutex)
通過鎖機制;同一時刻只允許乙個執行緒執行關鍵部分**。
1.初始化互斥鎖
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr)
引數:
mutex:互斥鎖位址,型別pthread_mutex_t
mutexattr:互斥鎖的屬性,通常設為null
也可以通過巨集:pthread_mutex_initalizer靜態初始化互斥鎖;
pthead_mutex_t mutex =pthread_mutex_initalizer;
這種方式等價於指定引數 mutexattr為null呼叫pthread_mutex_init()函式。
返回值:
成功:0,成功申請的鎖默開啟的。
失敗:非0錯誤碼
2,上鎖和解鎖
int pthread_mutex_lock(pthread_mutex_t *mutex);(和阻塞)
int pthread_mutex_trylock(pthread_mutex_t *mutex);(非阻塞,得不到鎖就立刻返回,並且ebusy錯誤)
int pthread_mutex_unlock(pthread_mutex_t *mutex);
3,銷毀鎖
int pthread_mutex_destroy(pthread_mutex_t *mutex);
例子:建立兩個執行緒,乙個列印hello,乙個列印world;
#include
#include
#include
pthread_mutex_t mutex;
void printer(char* str)
printf("\n");
pthread_mutex_unlock(&mutex); //解鎖
}void* pthread_func1(void* arg)
void* pthread_func2(void* arg)
int main()
結果:
如果不加鎖:就會亂序的列印:
執行緒同步與互斥 互斥鎖
在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...
執行緒同步與互斥 互斥鎖
在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...
執行緒同步1 互斥鎖
和多程序相比,多執行緒的最大特點就是資源的共享。然而共享卻涉及到乙個同步的問題,這是多執行緒程式設計的難點。linux系統提供了多種方式處理執行緒間的同步問題,主要有互斥鎖 條件變數和非同步訊號。本文先講互斥鎖。互斥鎖通過鎖機制來實現執行緒間的同步。在同乙個時刻,只允許乙個執行緒執行乙個關鍵部分的 ...