之后按r運行程序
進程是程序執行時的一個實例,是擔當分配系統資源(CPU時間、內存等)的基本單位。在面向線程設計的系統中,進程本身不是基本運行單位,而是線程的容器。程序本身只是指令、數據及其組織形式的描述,進程才是程序(那些指令和數據)的真正運行實例。
線程是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發多個線程,每條線程并行執行不同的任務。線程包含了表示進程內執行環境必須的信息,其中包括進程中表示線程的線程ID、一組寄存器值、棧、調度優先級和策略、信號屏蔽字、errno常量以及線程私有數據。進程的所有信息對該進程的所有線程都是共享的,包括可執行的程序文本、程序的全局內存和堆內存、棧以及文件描述符。在Unix和類Unix操作系統中線程也被稱為輕量級進程(lightweight processes),但輕量級進程更多指的是內核線程(kernel thread),而把用戶線程(user thread)稱為線程。
一、線程同步之互斥量加鎖解鎖
1. 創建及銷毀互斥鎖
#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,否則返回錯誤編號
要用默認的屬性初始化互斥量,只需把attr設置為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,否則返回錯誤編號
如果線程不希望被阻塞,它可以使用pthread_mutex_trylock嘗試對互斥量進行加鎖。如果調用pthread_mutex_trylock時互斥量處于未鎖住狀態,那么pthread_mutex_trylock將鎖住互斥量,不會出現阻塞并返回0,否則pthread_mutex_trylock就會失敗,不能鎖住互斥量,而返回EBUSY。
顧名思義就是加鎖某一個線程后,必須要等待此線程執行完后解鎖,其他的線程才能夠進行。在main函數里面加鎖后必須釋放鎖。
二、什么是死鎖
當兩個或兩個以上的線程在執行過程中,因為爭奪資源而造成的一種相互等待的狀態,由于存在一種環路的鎖依賴關系而永遠地等待下去,如果沒有外部干涉,他們將永遠等待下去,此時的這個狀態稱之為死鎖。
例:創建2個互斥鎖,進程1申請得到第一把鎖后,同時申請第二把鎖;進程2申請得到第二把鎖后,同時申請第一把鎖。
查找字符串
三、線程條件控制實現線程的同步
例:
定義一個全局變量a,讓全局變量a在線程1里面等于3的時候退出線程1,
方法一:加互斥鎖
方法二:引入條件量
首先在線程1里面調用pthread_cond_wait函數等待條件量的觸發,
在線程2中g_data達到3時,調用函數pthread_cond_signal()來觸發條件量,
四、使用宏來靜態初始化
在使用互斥變量、條件變量前都必須進行初始化,可以分別置為常量PTHREAD_MUTEX_INITIALIZER(只對靜態分配的互斥量)、PTHREAD_COND_INITIALIZER(只對靜態分配的條件變量),也可以通過調用pthread_mutex_init、pthread_cond_init函數進行初始化。如果動態地分配互斥量、條件變量(例如通過調用malloc函數),那么在釋放內存前需要調用pthread_mutex_destroy,條件變量可以使用pthread_cond_destroy函數對條件變量進行去除初始化(deinitialize)。
動態初始化:
pthread_mutex_t mutex; //dynamic init
pthread_cond_t cond; //dynamic init
主函數中必須:
pthread_mutex_init(&mutex, NULL); //dynamic init
pthread_cond_init(&cond, NULL); //dynamic init
使用宏進行初始化(靜態初始化):
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // static init
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // static init
審核編輯 黃宇
-
Linux
+關注
關注
87文章
11345瀏覽量
210392 -
多線程編程
+關注
關注
0文章
17瀏覽量
6708
發布評論請先 登錄
相關推薦
嵌入式Linux多線程編程
java多線程編程實例 (源程序)
linux多線程編程課件
linux多線程編程技術
mfc多線程編程實例及代碼,mfc多線程間通信介紹
![mfc<b class='flag-5'>多線程</b><b class='flag-5'>編程</b><b class='flag-5'>實例</b>及代碼,mfc<b class='flag-5'>多線程</b>間通信介紹](https://file1.elecfans.com//web2/M00/A7/0D/wKgZomUMQhGAETWKAAAPFV14HdY443.jpg)
關于Linux下多線程編程技術學習總結
![關于<b class='flag-5'>Linux</b>下<b class='flag-5'>多線程</b><b class='flag-5'>編程</b>技術學習總結](https://file.elecfans.com/web1/M00/4F/76/pIYBAFrb6diAReGYAAC6j3ajbn8113.png)
Linux下的多線程編程
Linux中多線程編程的知識點
![<b class='flag-5'>Linux</b>中<b class='flag-5'>多線程</b><b class='flag-5'>編程</b>的知識點](https://file1.elecfans.com/web2/M00/82/50/wKgZomRI7hKAUonUAAD2ERK4HW0091.png)
評論