linux下多程序和多執行緒程式設計之二 同步

2021-07-02 14:49:41 字數 3341 閱讀 9149

多程序,多執行緒的同步

多程序和多執行緒的同步,我們重點講解下多執行緒下的同步,這個是程式設計中最常用的。

多執行緒同步,總結以下幾種機制方式

第一:互斥鎖

互斥鎖的原理是利用互斥性,保證程式在某一刻只有乙個執行緒執行一段關鍵部分的**。

互斥變數的建立:有兩種方式,第乙個是pthread_mutex_t mutex=pthread_mutex_initialier。利用賦值的方式做靜態賦值

第二個是利用函式int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);進行初始化乙個互斥變數

然後使用函式int pthread_mutex_lock(pthread_mutex *mutex);顧名思義,這個函式就是對其進行上鎖。然後開始執行關鍵部分的**。

最後需要解鎖使用int pthread_mutex_unlock(pthread_mutex *mutex); 這個函式就是對其進行解鎖,然後其它執行緒才能獲取到鎖,進行上鎖

等這把鎖使用完畢,程式退出時,我們需要進行將鎖釋放,使用函式int pthread_mutex_destroy(pthread_mutex *mutex);

如下**所示

#include#include#includevoid* fun(void* i);

pthread_mutex_t mutex=pthread_mutex_initializer;//用賦值的方法初始化乙個互斥量,一把鎖

int count;//定義乙個全域性變數,讓所有的執行緒可以共享這個全域性變數

int main(int argc,char* argv)

for(i=0;i<10;i++)

}void* fun(void* i)

printf("count=%d\n",count++);//因為需要對這個全域性變數進行操作,所以我們需要進行加鎖,這部分可以稱為是關鍵**,也是執行緒需要同步的**部分

if(!pthread_mutex_unlock(&mutex))//執行成功返回0

}

以上程式執行結果是:

count=0

count=1

count=2

count=3

count=4

count=5

count=6

count=7

count=8

count=9

利用互斥量保證了執行緒的併發和同步,這裡需要對執行緒加解鎖函式呼叫做一次判斷,以免程式出現死鎖問題.

第二:條件變數

條件變數的產生是為了當多執行緒下,某個條件產生的時候,去執行一段**。通常條件變數和互斥鎖同時使用。

條件變數的建立和互斥量一樣,都有兩種方式,一種靜態賦值,一種動態使用函式的方式。靜態賦值的方式:pthread_cond_t cond=pthread_cond_initializer,動態呼叫函式的方式:intpthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);儘管posix標準中為條件變數定義了屬性,但在linuxthreads中沒有實現,因此cond_attr值通常為null,且被忽略.

條件變數的等待:有兩種方式等待:第一是條件等待:int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex),第二種是計時等待:int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime),計時等待方式如果在給定時刻前條件沒有滿足,則返回etimeout,結束等待,其中abstime以與time()系統呼叫相同意義的絕對時間形式出現,0表示格林尼治時間2023年1月1日0時0分0秒。但是無論哪種等待方式,都必須和乙個互斥鎖配合,以防止多個執行緒同時請求pthread_cond_wait()(或pthread_cond_timedwait())的競爭條件(race condition)。

條件變數的激發:激發條件有兩種形式,pthread_cond_signal()啟用乙個等待該條件的執行緒,存在多個等待執行緒時按入隊順序啟用其中乙個;而pthread_cond_broadcast()則啟用所有等待執行緒。

條件變數的登出:登出乙個條件變數需要呼叫pthread_cond_destroy(),只有在沒有執行緒在該條件變數上等待的時候才能登出這個條件變數,否則返回ebusy。

條件變數的使用最經典的模式是生產者與消費者模式,下面就用**描述這個模式。

#include#include#includevoid* fun(void* i);

void* fun1(void* i);

pthread_mutex_t mutex=pthread_mutex_initializer;

pthread_cond_t ccon=pthread_cond_initializer;

pthread_cond_t pcon=pthread_cond_initializer;

int size=0;

char store[5];

void print()//列印

int main(int argc,char* argv)

for(i=0;i<15;i++)

sem_destroy(&sem);

}

以上**詳細的描述了,訊號量在多執行緒的時候對資源的申請,這裡訊號量有10個大小,保證資源在同乙個時刻可以讓十個執行緒對其操作.

命名訊號量的操作函式有:sem_open、sem_close、sem_wait(阻塞p操作(-1)、sem_trywait、sem_post(喚醒v操作(+1))、sem_getvalue、sem_unlink(刪除系統中的訊號燈);用法和匿名信號量一致,在此我也就不一一描述了。

因為命名訊號量是對其檔案的全路徑進行申請的訊號量,所以申請乙個訊號量的時候,就像開啟乙個檔案一樣如:sem_open(path,o_creat|o_excl,

00666,

2);這裡的path是檔案的路徑,o_creat|o_excl是建立命名訊號量時候的方式,00666是建立時候的使用許可權,2是訊號量的數值。

ps:這裡我們需要注意的是一般發行版本的linux核心不支援有名訊號量的操作,需要在編譯核心的時候,將其開啟

還有乙個訊號量集:它屬於system v訊號量,是乙個集合;常用於程序間的通訊;system v的ipc要求用於程序間通訊的訊號量必須是乙個集合;它是系統核心定義的乙個資料結構;

訊號量集的初始化操作由shmget函式完成;這點我們在多程序多執行緒通訊上講解,這裡不做多的描述.讀者可檢視多程序多執行緒程式設計之三通訊。

多程序和多執行緒

嵌入式linux中文站,關於多程序和多執行緒,教科書上最經典的一句話是 程序是資源分配的最小單位,執行緒是cpu排程的最小單位 這句話應付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有那麼簡單了,選的不好,會讓你深受其害。經常在網路上看到有xdjm問 多程序好還是多執行緒好?linux下...

多執行緒和多程序

首先說什麼是程序,載入記憶體中執行的程式,它就是乙個程序,而這個程式中執行的某個子任務就是乙個執行緒,程式包含了執行緒。程序對於執行緒是唯一的,而乙個程序可以有多個執行緒。程式執行的時候每隔一定時間在多執行緒之間執行,比如第乙個執行緒執行到0.01秒,馬上暫停跳到下乙個執行緒開始執行,又執行到0.0...

多程序和多執行緒

一 python 中多程序的使用 1 使用multiprocessing p process target function,args 引數,p.start 含義啟動程序 p.join 含義是等待子程序結束後在繼續執行 2 如果啟動大量的子程序,可以用程序池的方式批量建立子程序 from multi...