NDK系列9 c 執行緒基本使用 執行緒同步

2021-09-25 02:06:29 字數 3615 閱讀 1194

執行緒同步

條件變數

執行緒,有時被稱為輕量程序,是程式執行的最小單元。

#include

void

task

(int i)

thread t1

(task,

100)

;//等待執行緒結束再繼續執行

t1.join()

;

posix 可移植作業系統介面,標準定義了作業系統應該為應用程式提供的介面標準

#include

void

*pthreadtask

(void

* args)

pthread_t pid;

int pi =

100;

pthread_create

(&pid,

0, pthreadtask,

&pi)

;//等待執行緒的結束

pthread_join

(pid,0)

;

執行緒具有屬性,用pthread_attr_t表示

pthread_attr_t attr;

//初始化 attr中為作業系統實現支援的執行緒所有屬性的預設值

pthread_attr_init

(&attr)

;pthread_attr_destroy

(&attr)

;

分離執行緒

執行緒建立預設是非分離的,當pthread_join()函式返回時,建立的執行緒終止,釋放自己占用的系統資源

分離執行緒不能被其他執行緒等待,pthread_join()無效,執行緒自己玩自己的。

//設定是否為分離執行緒

//pthread_create_detached 分離

//pthread_create_joinable 非分離

pthread_attr_setdetachstate

(&attr,pthread_create_detached)

;

排程策略與優先順序
//設定排程策略 

//返回0 設定成功

pthread_attr_setschedpolicy

(&attr, sched_fifo)

;// sched_fifo

// 實時排程策略,先到先服務 一旦占用cpu則一直執行。一直執行直到有更高優先順序任務到達或自己放棄。

// sched_rr

// 實時排程策略,時間輪轉 系統分配乙個時間段,在時間段內執行本執行緒

//設定優先順序

//獲得對應策略的最小、最大優先順序

int max =

sched_get_priority_max

(sched_fifo)

;int min =

sched_get_priority_min

(sched_fifo)

;sched_param param;

param.sched_priority = max;

pthread_attr_setschedparam

(&attr,

¶m);

多執行緒同時讀寫同乙份共享資源的時候,可能會引起衝突。需要引入執行緒「同步」機制,即各位執行緒之間有序地對共享資源進行操作。

以下是會出現問題的寫法

#include

using namespace std;

queue<

int> q;

void

*pop

(void

* args)

else

return0;

}int

main()

pthread_t pid[10]

;for

(size_t i =

0; i <

10; i++

)system

("pause");

return0;

}

加入互斥鎖

queue<

int> q;

pthread_mutex_t mutex;

void

*pop

(void

* args)

else

// 放

pthread_mutex_unlock

(&mutex)

;return0;

}int

main()

pthread_t pid[10]

;for

(size_t i =

0; i <

10; i++

)//需要釋放

for(size_t i =

0; i <

10; i++

)pthread_mutex_destroy

(&mutex)

;system

("pause");

return0;

}

條件變數是執行緒間進行同步的一種機制,主要包括兩個動作:乙個執行緒等待"條件變數的條件成立"而掛起;另乙個執行緒使"條件成立",從而喚醒掛起執行緒

template 

class safequeue

~safequeue()

void

enqueue

(t t)

intdequeue

(t& t)

pthread_mutex_unlock

(&mutex)

;return0;

}private:

queue q;

pthread_mutex_t mutex;

};

上面的模板類存放資料t,並使用互斥鎖保證對queue的操作是執行緒安全的。這就是乙個生產/消費模式。

如果在取出資料的時候,queue為空,則一直等待,直到下一次enqueue加入資料。

這就是乙個典型的生產/消費模式, 加入條件變數使 「dequeue」 掛起,直到由其他地方喚醒

下面是使用條件變數實現

通過使用cond條件來 喚醒等待中的執行緒

#pragma once

#include

using namespace std;

template

class safequeue

~safequeue()

void

enqueue

(t t)

intdequeue

(t& t)

t = q.

front()

; q.

pop();

pthread_mutex_unlock

(&mutex)

;return1;

}private:

queue q;

pthread_mutex_t mutex;

pthread_cond_t cond;

};

9 C 知識點 執行緒初識及Thread初識 一

執行緒和程序的簡單概括。1.程序就是 活動中 的程式,乙個。程式是乙個沒有生命的實體,只有處理器賦予程式生命時,它才能成為乙個活動的實體,我們稱其為程序。程序之間是相互獨立的。程式是指令的集合,它是程序執行的靜態描述文字 程序是程式的一次執行活動,屬於動態概念。2.執行緒有時候又被稱為輕量級程序,是...

9 C語言基本資料型別

有符號數 記憶體空間最高位元組是符號位。無符號數 記憶體空間最高位元組是資料。int 預設是有符號的.一般,有符號數用於計算,無符號數表示資料.對於右移運算,有符號數無法進行運算,因為最高位永遠是符號位 無符號數,更多的同於資料的採集 訪問 有符號數代表數字 浮點型與整型在記憶體中的儲存結構不同 浮...

C 多執行緒系列

個人感覺c 的程式設計,除了對演算法和類庫的使用以外,達到一定的水平以後,多執行緒的使用將會成為乙個很大的瓶頸。所以重新花費時間讀了一本書 net 4.0物件導向程式設計漫談 應用篇 裡面關於多執行緒的描述。自己做了乙個讀書筆記,把多執行緒部分的要點進行了梳理,並且適當的加上了一些自己的測試和理解。...