久久久国产一区二区_国产精品av电影_日韩精品中文字幕一区二区三区_精品一区二区三区免费毛片爱
機械社區(qū)
標題:
Linux多線程及線程間同步
[打印本頁]
作者:
tainqing
時間:
2017-12-8 17:15
標題:
Linux多線程及線程間同步
1、
進程和線程的區(qū)別
! \5 x! X) O7 G7 S# W
進程的目的就是擔當分配系統(tǒng)資源(
CPU時間、內(nèi)存等)的基本單位。線程是進程的一個執(zhí)行流,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。一個進程由幾個線程組成,線程與同屬一個進程的其他的線程共享進程所擁有的全部資源。
. q" r% S$ O& g
3 w( W7 E) Q" @2 }9 u. d& q9 X
地址空間:進程有獨立的地址空間,包括文本區(qū)域(
text region)、數(shù)據(jù)區(qū)域(data region)和堆棧(stack region);一個進程崩潰后,在保護模式下不會對其它進程產(chǎn)生影響;線程只是一個進程中的不同執(zhí)行路徑,線程有自己的堆棧和局部變量(在運行中必不可少的資源),但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉。同一進程內(nèi)的線程共享進程的地址空間。
. J: k' p% S$ O6 G
) T/ \- P& U4 U, A5 O
通信
:進程間通信
IPC,線程間可以直接讀寫進程數(shù)據(jù)段(如全局變量)來進行通信——需要進程同步和互斥手段的輔助,以保證數(shù)據(jù)的一致性。
7 i1 K1 q3 H3 V9 X) l5 ]' L9 g
4 F5 A& a4 n/ \+ Q X3 `
調(diào)度和切換:線程上下文切換比進程上下文切換要快得多。
. J% @/ o( v! I% x
# q o5 x$ `* C5 S0 w5 I' {
在多線程
OS中,進程不是一個可執(zhí)行的實體。
9 \+ _# z2 x: \* Z: f1 x6 [8 L
7 a2 D0 p+ M& W! M) A
地址空間
:進程內(nèi)的一個執(zhí)行單元;進程至少有一個線程;它們共享進程的地址空間;而進程有自己獨立的地址空間;
9 E0 a1 ]( M3 O' p6 i$ U
! V4 T, Z( L# y$ B; l% u: i
資源擁有
:進程是資源分配和擁有的單位,同一個進程內(nèi)的線程共享進程的資源
7 |( `3 _; E2 }. u7 u) }4 @- K
% _3 i% s. k4 a; ]% i, d9 K: G
線程是處理器調(diào)度的基本單位
,但進程不是.
% d* L- c. z, C- T8 q7 b
6 ]- o9 p P+ l, ]" t) F# ~& f* n
二者均可并發(fā)執(zhí)行
.
0 D% k$ m2 d; T/ \& Z
$ {4 L& A$ P8 R! J0 n$ F& x1 A
2、使用線程原因
& [" k! W- {8 I4 X8 ~
在Linux系統(tǒng)下,啟動一個新的進程必須分配給它獨立的地址空間,建立眾多的數(shù)據(jù)表來維護它的代碼段、堆棧段和數(shù)據(jù)段,這是一種"昂貴"的多任務(wù)工作方式。而運行于一個進程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分數(shù)據(jù),啟動一個線程所花費的空間遠遠小于啟動一個進程所花費的空間,而且,線程間彼此切換所需的時間也遠遠小于進程間切換所需要的時間。
* E. m) @6 M* v& r# k& [
線程間方便的通信機制。對不同進程來說,它們具有獨立的數(shù)據(jù)空間,要進行數(shù)據(jù)的傳遞只能通過通信的方式進行,這種方式不僅費時,而且很不方便。線程則不然,由于同一進程下的線程之間共享數(shù)據(jù)空間,所以一個線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,而且方便。
5 [5 |" G2 H% [3 e
# D0 C: M0 K; g7 T
* E& j' m/ |0 W7 G
3、線程操作的函數(shù)
D6 `4 f T6 u% s6 c! h. V; G! F
#include <pthread.h>
6 U% S* j8 j$ Y+ a& \
int pthread_create(pthread_t *
ti
d, const pthread_attr_t *attr, void *(*func) (void *), void *arg);
8 G/ K4 F4 S; z
int pthread_join (pthread_t tid, void ** status);
8 c3 U% }, m2 F! h: _
pthread_t pthread_self (void);
) @8 a. N# r* {- v% e6 V6 o2 p! T# ]
int pthread_detach (pthread_t tid);
$ ?0 ^* `7 |' b8 A8 a/ j' {
void pthread_exit (void *status);
# P8 ?, h& E1 s5 B4 f; E7 q3 h
9 V# Q# g0 H+ G& c/ m/ ?! t
pthread_create:用于創(chuàng)建一個線程,成功返回0,否則返回Exxx(為正數(shù))。
2 x) z6 R3 ]( s" O6 K3 t; G
pthread_t *tid:線程id的類型為pthread_t,通常為無符號整型,當調(diào)用pthread_create成功時,通過*tid指針返回。
- p: N4 ]8 ?7 D$ R' D9 p3 }
: O9 Y) C8 O( p) Z1 E
const pthread_attr_t *attr:指定創(chuàng)建線程的屬性,如線程優(yōu)先級、初始棧大小、是否為守護進程等。可以使用NULL來使用默認值,通常情況下我們都是使用默認值。
; G7 \7 Y0 W, z! L1 U$ y, i! e
! v7 @; X8 p! E& D$ |5 N( I
void *(*func) (void *):函數(shù)指針func,指定當新的線程創(chuàng)建之后,將執(zhí)行的函數(shù)。
6 {& y/ f: e$ v- ~' Q
7 S, h. ~6 f9 }: ~9 f d
void *arg:線程將執(zhí)行的函數(shù)的參數(shù)。
嵌入式系統(tǒng)學習意義氣嗚嗚吧久零就易,
如果想傳遞多個參數(shù),請將它們
封裝
在一個結(jié)構(gòu)體中。
. K; ]2 _/ r, y4 {; K8 F
$ i4 c3 {7 ^, j$ \
pthread_join:用于等待某個線程退出,成功返回0,否則返回Exxx(為正數(shù))。
0 B' b8 j8 v8 X# E8 c1 G
pthread_t tid:指定要等待的線程ID
& W3 W: Z% k8 @# ]# d) y
+ p1 F: v- ?) d, O* z% U# B' l: l
void ** status:如果不為NULL,那么線程的返回值存儲在status指向的空間中(這就是為什么status是二級指針的原因!這種才參數(shù)也稱為“值-結(jié)果”參數(shù))。
1 ]1 X6 n$ F+ b, F
6 O! y% u* k) C
pthread_self:用于返回當前線程的ID。
; t; E' y Z$ s
pthread_detach:用于是指定線程變?yōu)榉蛛x狀態(tài),就像進程脫離終端而變?yōu)楹笈_進程類似。成功返回0,否則返回Exxx(為正數(shù))。變?yōu)榉蛛x狀態(tài)的線程,如果線程退出,它的所有資源將全部釋放。而如果不是分離狀態(tài),線程必須保留它的線程ID,退出狀態(tài)直到其它線程對它調(diào)用了pthread_join。
' J1 \) a8 c" ]7 L- ]" l
pthread_exit用于終止線程,可以指定返回值,以便其他線程通過pthread_join函數(shù)獲取該線程的返回值。
# l9 | h" ]3 V8 W4 m! m1 G6 p5 @
void *status:指針線程終止的返回值。
* Z6 P+ n* |: b5 l
8 x$ B, Z5 W4 x; }" Q; j5 B
4、線程間互斥
$ q5 h& r/ }2 U3 {
使用互斥鎖(互斥)可以使線程按順序執(zhí)行。通常,互斥鎖通過確保一次只有一個線程執(zhí)行代碼的臨界段來同步多個線程。互斥鎖還可以保護單線程代碼。
2 H. V1 t* v7 I! a9 d
int pthread_mutex_lock(pthread_mutex_t * mptr);
5 V% |2 T) H* |8 g2 N# b* Q/ Y
int pthread_mutex_unlock(pthread_mutex_t * mptr);
- l9 Q. A) Z0 ^# [- L: O' W
* F1 N7 n) z" g9 Y
先聲明一個
pthread_mutex_t類型的變量,用作下面兩個函數(shù)的參數(shù)。在對臨界資源進行操作之前需要pthread_mutex_lock先加鎖,操作完之后pthread_mutex_unlock再解鎖。
/ j% y" R0 N9 c6 z* s
* }( J5 @# k3 x& {6 K
+ h7 W$ D% E( z9 T$ {3 J4 P J+ P6 S: ~
5、線程間同步
! ~# l5 c( b+ `* ~
條件變量:使用條件變量可以以原子方式阻塞線程,直到某個特定條件為真為止。條件變量始終與互斥鎖一起使用。對條件的測試是在互斥鎖(互斥)的保護下進行的。
2 s) w" [/ u5 u* G
#include <pthread.h>
8 o' x$ e! A v$ O' ?
int pthread_cond_wait(pthread_cond_t *cptr, pthread_mutex_t *mptr);
0 Q9 q" k7 d) Y. t8 a X
int pthread_cond_signal(pthread_cond_t *cptr);
$ w, T8 K0 J4 t6 B5 {2 s6 K; @% T
//Both return: 0 if OK, positive Exxx value on error
* I& U8 Y$ u% q
: |) B8 h- y" O$ ?
pthread_cond_wait用于等待某個特定的條件為真,pthread_cond_signal用于通知阻塞的線程某個特定的條件為真了。在調(diào)用者兩個函數(shù)之前需要聲明一個pthread_cond_t類型的變量,用于這兩個函數(shù)的參數(shù)。
3 a$ w9 Q- A- p/ J! p0 \
/*
9 r! Q- }/ u5 Q% o7 J; l
是否熟悉
POSIX多線程編程技術(shù)?如熟悉,編寫程序完成如下功能:
& f5 U6 b" d& a Y; [ o
1)有一int型全局變量g_Flag初始值為0;
" T3 P1 r! f' |! H/ v. M/ Y6 q
2)在主線稱中起動線程1,打印“this is thread1”,并將g_Flag設(shè)置為1
) q0 q' ^% v: l0 o' Y
3)在主線稱中啟動線程2,打印“this is thread2”,并將g_Flag設(shè)置為2
# | Y4 E! A- U9 D
4)線程序1需要在線程2退出后才能退出
/ [7 S$ g7 F0 P* z
5)主線程在檢測到g_Flag從1變?yōu)?,或者從2變?yōu)?的時候退出
* a8 O1 u7 U( O4 g0 J3 {: u
歡迎光臨 機械社區(qū) (http://www.ytsybjq.com/)
Powered by Discuz! X3.5