14 多執行緒程式設計

2022-05-02 17:09:12 字數 1913 閱讀 1608

這裡所指的執行緒是posix執行緒(簡稱pthread)

執行緒同步方式:posix訊號量、互斥鎖、條件變數

根據執行環境和排程者身份,執行緒可分為核心執行緒和使用者執行緒

建立執行緒和結束執行緒

1 #include 2

int pthread_create(pthread_t* thread, const pthread_attr_* attr, void* (*start_routine)(void*), void* arg); //

建立執行緒

3int pthread_exit(void* retval); //

退出執行緒45

//乙個程序中的所有執行緒都可以呼叫pthread_join函式來**其他執行緒,即等待其他執行緒結束

6int pthread_join(pthread_t thread, void**retval); 78

9//有時候我們希望異常終止乙個執行緒,即取消執行緒

10int

pthread_cancel(pthread_t thread);

1112

//目標執行緒可以決定是否允許被取消以及如何取消,這分別由如下兩個函式完成:

13int pthread_setcancelstate(int state, int*oldstate);

14int pthread_setcanceltype(int type, int* oldtype);

執行緒屬性

pthread_attr_t 結構體定義了一套完整的執行緒屬性

#include #define __sizeof_pthread_attr_t 36typedef unionpthread_attr_t;

posix訊號量

互斥鎖

#include int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t*mutexattr);

int pthread_mutex_destroy(pthread_mutex_t*mutex);

int pthread_mutex_lock(pthread_mutex_t*mutex);

int pthread_mutex_trylock(pthread_mutex_t*mutex);

int pthread_mutex_unlock(pthread_mutex_t* mutex);

條件變數

執行緒間同步共享資料的值,條件變數提供了一種執行緒間的通知機制:當某個共享資料達到某個值的時候,喚醒等待這個共享資料的執行緒

1

int pthread_cond_init(pthread_cond_t* cond, const pthread_condattr_t*cond_attr);

2int pthread_cond_destroy(pthread_cond_t*cond);

3int pthread_cond_broadcast(pthread_cond_t*cond);

4int pthread_cond_signal(pthread_cond_t*cond);

5int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);

多執行緒環境

可重入函式:如果乙個函式能被多個執行緒同時呼叫且不發生競態條件,則我們稱它是執行緒安全的,或說它是可重入函式。linux庫函式只有一小部分是不可重入的。這些庫函式之所以不可重入,主要是因為其內部使用了靜態變數。不可重入庫函式的可重入版本是在原函式名尾部加上 _r。

14 (多執行緒)Multithreading

傳統的gui應用只有乙個執行緒,一次只執行乙個操作。如果使用者從介面進行了乙個非常耗時的操作,在操作正在執行的時候,介面是沒有任何響應的。在第七章事件處理中提出了這個問題的乙個解決方案。多執行緒是另乙個解決方案。在乙個多執行緒的應用中,gui執行在獨自的執行緒中,其他的操作則發生其他的乙個或者多個執...

多執行緒程式設計

1 多執行緒的基本思路不是在介面執行緒執行費時的 而是專門啟動乙個執行緒 稱作工作執行緒 來完成,介面執行緒只負責介面的 顯示 和操作,而工作執行緒只負責耗時的操作過程。2 對於普通的win32應用程式來說,執行緒可以分為兩種 介面 ui user inte ce 執行緒和工作執行緒。介面執行緒一般...

多執行緒程式設計

如何編寫執行緒安全的dll 在我的工作中經常會編寫dll,這些dll有個共同的特點就是都有乙個初始化函式,乙個資源釋放函式,其他幾個函式都是核心功能函式。而且這些dll有時會被多個程序同時呼叫,這就牽扯到多程序的多執行緒呼叫dll的問題。有點繞口,以下我根據我實踐中遇到的問題,分四種情況分享一下我解...