執行緒同步
條件變數
執行緒,有時被稱為輕量程序,是程式執行的最小單元。
#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物件導向程式設計漫談 應用篇 裡面關於多執行緒的描述。自己做了乙個讀書筆記,把多執行緒部分的要點進行了梳理,並且適當的加上了一些自己的測試和理解。...