之后按r運(yùn)行程序
進(jìn)程是程序執(zhí)行時(shí)的一個(gè)實(shí)例,是擔(dān)當(dāng)分配系統(tǒng)資源(CPU時(shí)間、內(nèi)存等)的基本單位。在面向線程設(shè)計(jì)的系統(tǒng)中,進(jìn)程本身不是基本運(yùn)行單位,而是線程的容器。程序本身只是指令、數(shù)據(jù)及其組織形式的描述,進(jìn)程才是程序(那些指令和數(shù)據(jù))的真正運(yùn)行實(shí)例。
線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。線程包含了表示進(jìn)程內(nèi)執(zhí)行環(huán)境必須的信息,其中包括進(jìn)程中表示線程的線程ID、一組寄存器值、棧、調(diào)度優(yōu)先級(jí)和策略、信號(hào)屏蔽字、errno常量以及線程私有數(shù)據(jù)。進(jìn)程的所有信息對(duì)該進(jìn)程的所有線程都是共享的,包括可執(zhí)行的程序文本、程序的全局內(nèi)存和堆內(nèi)存、棧以及文件描述符。在Unix和類Unix操作系統(tǒng)中線程也被稱為輕量級(jí)進(jìn)程(lightweight processes),但輕量級(jí)進(jìn)程更多指的是內(nèi)核線程(kernel thread),而把用戶線程(user thread)稱為線程。
一、線程同步之互斥量加鎖解鎖
1. 創(chuàng)建及銷毀互斥鎖
#include int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); int pthread_mutex_destroy(pthread_mutex_t mutex); // 返回:若成功返回0,否則返回錯(cuò)誤編號(hào)
要用默認(rèn)的屬性初始化互斥量,只需把a(bǔ)ttr設(shè)置為NULL。
2. 加鎖及解鎖
#include int pthread_mutex_lock(pthread_mutex_t mutex); int pthread_mutex_trylock(pthread_mutex_t mutex); int pthread_mutex_unlock(pthread_mutex_t mutex); // 返回:若成功返回0,否則返回錯(cuò)誤編號(hào)
如果線程不希望被阻塞,它可以使用pthread_mutex_trylock嘗試對(duì)互斥量進(jìn)行加鎖。如果調(diào)用pthread_mutex_trylock時(shí)互斥量處于未鎖住狀態(tài),那么pthread_mutex_trylock將鎖住互斥量,不會(huì)出現(xiàn)阻塞并返回0,否則pthread_mutex_trylock就會(huì)失敗,不能鎖住互斥量,而返回EBUSY。
顧名思義就是加鎖某一個(gè)線程后,必須要等待此線程執(zhí)行完后解鎖,其他的線程才能夠進(jìn)行。在main函數(shù)里面加鎖后必須釋放鎖。
二、什么是死鎖
當(dāng)兩個(gè)或兩個(gè)以上的線程在執(zhí)行過(guò)程中,因?yàn)闋?zhēng)奪資源而造成的一種相互等待的狀態(tài),由于存在一種環(huán)路的鎖依賴關(guān)系而永遠(yuǎn)地等待下去,如果沒(méi)有外部干涉,他們將永遠(yuǎn)等待下去,此時(shí)的這個(gè)狀態(tài)稱之為死鎖。
例:創(chuàng)建2個(gè)互斥鎖,進(jìn)程1申請(qǐng)得到第一把鎖后,同時(shí)申請(qǐng)第二把鎖;進(jìn)程2申請(qǐng)得到第二把鎖后,同時(shí)申請(qǐng)第一把鎖。
查找字符串
三、線程條件控制實(shí)現(xiàn)線程的同步
例:
定義一個(gè)全局變量a,讓全局變量a在線程1里面等于3的時(shí)候退出線程1,
方法一:加互斥鎖
方法二:引入條件量
首先在線程1里面調(diào)用pthread_cond_wait函數(shù)等待條件量的觸發(fā),
在線程2中g(shù)_data達(dá)到3時(shí),調(diào)用函數(shù)pthread_cond_signal()來(lái)觸發(fā)條件量,
四、使用宏來(lái)靜態(tài)初始化
在使用互斥變量、條件變量前都必須進(jìn)行初始化,可以分別置為常量PTHREAD_MUTEX_INITIALIZER(只對(duì)靜態(tài)分配的互斥量)、PTHREAD_COND_INITIALIZER(只對(duì)靜態(tài)分配的條件變量),也可以通過(guò)調(diào)用pthread_mutex_init、pthread_cond_init函數(shù)進(jìn)行初始化。如果動(dòng)態(tài)地分配互斥量、條件變量(例如通過(guò)調(diào)用malloc函數(shù)),那么在釋放內(nèi)存前需要調(diào)用pthread_mutex_destroy,條件變量可以使用pthread_cond_destroy函數(shù)對(duì)條件變量進(jìn)行去除初始化(deinitialize)。
動(dòng)態(tài)初始化:
pthread_mutex_t mutex; //dynamic init
pthread_cond_t cond; //dynamic init
主函數(shù)中必須:
pthread_mutex_init(&mutex, NULL); //dynamic init
pthread_cond_init(&cond, NULL); //dynamic init
使用宏進(jìn)行初始化(靜態(tài)初始化):
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // static init
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // static init
審核編輯 黃宇
-
Linux
+關(guān)注
關(guān)注
87文章
11511瀏覽量
213845 -
多線程編程
+關(guān)注
關(guān)注
0文章
17瀏覽量
6820
發(fā)布評(píng)論請(qǐng)先 登錄
Linux c多線程編程的4個(gè)實(shí)例
Linux c多線程編程的4個(gè)實(shí)例分享
嵌入式Linux多線程編程
java多線程編程實(shí)例 (源程序)
linux多線程編程課件
linux多線程編程開(kāi)發(fā)

linux多線程編程技術(shù)
mfc多線程編程實(shí)例及代碼,mfc多線程間通信介紹

什么是多線程編程?多線程編程基礎(chǔ)知識(shí)
關(guān)于Linux下多線程編程技術(shù)學(xué)習(xí)總結(jié)

Linux下的多線程編程
Linux中多線程編程的知識(shí)點(diǎn)

評(píng)論