向你的C語言專案中加入多執行緒

2022-04-28 09:06:21 字數 2274 閱讀 4130

c語言在標準庫中為程式設計師提供了多執行緒操作介面。

int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine) (void *arg), void *arg)執行緒建立

int pthread_join( pthread_t thread, void * * value_ptr )執行緒等待

int pthread_detach(pthread_t thread)執行緒分離

int pthread_exit(pthread_t th, void **thr_return)執行緒結束

pthread_t是表示執行緒號的資料型別。它的出處是/usr/include/bits/pthreadtypes.h。

typedef unsigned long int pthread_t
執行緒建立函式,為新執行緒分配資源並且建立成功後執行緒即開始執行,新執行緒的執行緒號即傳參進去的執行緒號。

通過第二個引數指定新執行緒的屬性為「joinable」或「detached」,預設為joinable。若執行緒屬性為joinable,則需要由其他執行緒呼叫pthread_join阻塞等待其結束並為之**資源,不然就成了"殭屍執行緒";若執行緒屬性為detached,則執行緒結束後自動**所有資源。

int pthread_create(pthread_t *thread,   目標執行緒的執行緒號

pthread_attr_t *attr, 設定執行緒的屬性

void *(*start_routine) (void *arg), 目標函式的起始位址

void *arg) 目標函式的引數

當呼叫pthread_join時,當前執行緒進入阻塞狀態,等待被連線的執行緒執行結束返回,當前執行緒再轉回執行狀態。被連線的執行緒必須是非分離的。乙個執行緒不能被多個執行緒等待。

int pthread_join( pthread_t  thread,      目標執行緒的執行緒號 

void * * value_ptr ) 目標執行緒的返回值

將joinable的執行緒設定為detached的執行緒。這樣該執行緒在執行結束後會自動**其所有資源。

呼叫pthread_exit可以顯式地結束當前執行緒,傳入的唯一的引數是執行緒的返回值。

//兩種方法對鎖進行初始化

pthread_mutex_t mutex = pthread_mutex_initializer;

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr);

//互斥鎖的銷毀

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);

// 初始化條件變數

int pthread_cond_init(pthread_cond_t *cond,

pthread_condattr_t *cond_attr);

// 阻塞等待

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

// 超時等待

int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,

const timespec *abstime);

// 解除所有執行緒的阻塞

int pthread_cond_destroy(pthread_cond_t *cond);

// 至少喚醒乙個等待該條件的執行緒

int pthread_cond_signal(pthread_cond_t *cond);

// 喚醒等待該條件的所有執行緒

int pthread_cond_broadcast(pthread_cond_t *cond);

在vs中加入c語言檔案的方法

環境vs2010 1.將c語言加入工程中,右鍵該檔案,選擇屬性 預編譯頭 不使用預編譯頭,否個會提示 fatal error c1853 filename 預編譯標頭檔案來自編譯器的早期版本,或者預編譯頭為 c 而在 c 中使用它 或相反 參考 2.在extern要呼叫的函式的位置,加入 ifdef...

QT學習記錄(二)在QT中加入多執行緒的方式

近期在解析ts流檔案時發現資料量太大,如果在主線程處理會造成介面卡頓,所以需要在qt中加入多執行緒完成解析資料工作。通常qt內加入多執行緒有三種比較方便的方式 分割線 1.movetothread 新建乙個繼承qobject a,然後將耗時的工作函式 void dowork 寫到這類裡面,在主線程n...

多執行緒在實際專案中的簡單應用

專案中如何使用多執行緒專案業務場景 批量頁面靜態化 在系統中,商品詳情頁我們使用freemarker來進行頁面靜態化,每天夜裡12點開始要對所有商品頁面進行一遍靜態化,由於商品數量比較多 如果使用單執行緒將耗時過長,我們使用乙個定長線程池進行批量執行,將任務放在佇列中,多個執行緒同時領取並執行。訂單...