Linux多執行緒程式設計與執行緒間通訊機制

2021-07-09 16:04:45 字數 2980 閱讀 6071

linux中多執行緒程式設計技術被廣泛使用,這主要是因為多執行緒可以提公升程式的執行效率和便利性。在現在的比較大一點的linux程式中,沒有使用多執行緒程式設計技術是不可想象的。有多執行緒,那麼就涉及到執行緒間的通訊問題,簡單來說就是執行緒a怎麼把訊息傳遞給執行緒b。目前執行緒間通訊的用的比較多的主要技術有訊息佇列、共享記憶體。本文就來講講linux中多執行緒程式設計的實現,以及利用訊息佇列進行執行緒間通訊。

、執行緒的建立

執行緒的建立首先需要包含標頭檔案:

#include

1建立執行緒的函式:

pthread_create(pthread_t ptid,null,(void *)cmd,null);

返回值為0時表示執行緒建立成功。

2將該子執行緒的狀態設定為

detached,

以便該執行緒執行結束後自動釋放其占用的資源

pthread_detach(pthread_t *ptid);

3kill

乙個執行緒

pthread_cancel(pthread_t tid);

、執行緒之間的同步

多執行緒程式設計時經常會出現多個執行緒同時去操作同乙個資源的情況,比如說執行緒

a和執行緒

b在某乙個時間內都想去操作同乙個全域性變數

c,那麼這個時候就需要進行執行緒同步。執行緒

a告訴執行緒

b,我正在對全域性變數

c進行操作,等我操作完成後,你們再來吧。目前執行緒同步的技術主要有互斥鎖

(mutex)

和訊號量

(semaphore)

。本文主要講一下互斥鎖。 1

定義乙個互斥鎖

pthread_mutex_t mutex;

2 互斥鎖上鎖

pthread_mutex_lock(mutex);

3 解鎖

pthread_mutex_unlock(mutex);

、執行緒間通訊

執行緒之間有時候需要傳遞訊息,比如說執行緒

a負責處理網路資料,當網路有資料到來時,執行緒

a就開始工作了,它把處理的結果反饋給主線程。告訴主線程有網路事件到來,而且有資料需要你處理。執行緒間通訊用的比較多的就是訊息佇列和共享記憶體。本文主要講一下訊息佇列的使用。 1

訊息的建立

unsigned int threadtype

;key_t key = 1050 + threadtype;

msgget(key, ipc_creat|0666));

2 傳送訊息

msgsnd(unsigned int msgid, void * msg, unsigned int msgsize,ipc_nowait);3

接收訊息

msgrcv(msgid, &msg, sizeof(msg)-sizeof(long), 0,msg_noerror);

、程式設計例項

本文將建立例項來講解

typedef struct mesagethread

_mesagethread,*_pmesagethread;

typedef struct thread_head

_thread_head,*_pthread_head;

_thread_head threadhead;

int createthread(pthread_t *ptid,void (* cmd)(),unsigned int thread_type)

return result;

}

int addto_list(pthread_t *ptid,unsigned int thread_type)

else

}result = 1;

} return result;

}

int getlistend(_mesagethread *end)

else p = p->next;

} }pthread_mutex_unlock(&threadhead.mutex);

return result;

}

typedef struct msginfo

_msginfo,*_pmsginfo;

typedef struct msglist

_msghead,*_pmsghead;

_msglist_head msghead;

enum

;

通過執行緒型別得到訊息型別

int getmessageid(unsigned int type,unsigned int *msgid)

pmsglistnow = pmsglistnow->next;

} pthread_mutex_unlock(&msghead.mutex);

return result;

}

void sendmessage(unsigned char type,void *msg)

}

typedef struct threada_msg

;typedef struct threadmain_msg

;

建立執行緒a

void threada()

if()//需要觸發的傳送訊息的條件

}

建立主線程

void main()

}}

Python高階專題 多執行緒程式設計之執行緒間通訊

執行緒間的通訊在多執行緒程式設計過程中難以避免,常見的執行緒間通訊方式有兩種 共享變數 通過訊息佇列queue實現 1.共享變數 目前接觸的問題來看,適應於解釋多執行緒程式設計過程中乙個典型例項 nums 0def insertnums global nums for i in range 1000...

多執行緒程式設計 多執行緒間通訊(五)

一般而言 應用程式中的乙個次要執行緒總是為主執行緒執行特定的任務,這樣 主線程和次要執行緒間必定有乙個資訊傳遞的渠道,也就是主線程和次要執行緒間要進行通訊。這種執行緒間 的通訊不但是難以避免的,而且在多執行緒程式設計中也是複雜和頻繁的,下面將進行說明。使用全域性變數進行通訊 由於屬於同乙個程序的各個...

Linux 多執行緒程式設計 執行緒退出

今天分析專案中程序中虛存一直增長問題,執行10個小時虛存漲到121g rss占用為16g 非常恐怖。valgrind測試無記憶體洩漏。記憶體32g 64bit系統資訊如下 linux執行緒使用方式是主程序依據請求的多少動態建立和退出執行緒。通過pmap x pid檢視程序內個部分記憶體分配情況 發現...