国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

Linux多線程及線程間同步

發布時間:2017-12-8 14:13    發布者:ludi
關鍵詞: 嵌入式 , 進程
1、進程和線程的區別
進程的目的就是擔當分配系統資源(CPU時間、內存等)的基本單位。線程是進程的一個執行流,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。一個進程由幾個線程組成,線程與同屬一個進程的其他的線程共享進程所擁有的全部資源。

地址空間:進程有獨立的地址空間,包括文本區域(text region)、數據區域(data region)和堆棧(stack region);一個進程崩潰后,在保護模式下不會對其它進程產生影響;線程只是一個進程中的不同執行路徑,線程有自己的堆棧和局部變量(在運行中必不可少的資源),但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉。同一進程內的線程共享進程的地址空間。

通信:進程間通信IPC,線程間可以直接讀寫進程數據段(如全局變量)來進行通信——需要進程同步和互斥手段的輔助,以保證數據的一致性。

調度和切換:線程上下文切換比進程上下文切換要快得多。

在多線程OS中,進程不是一個可執行的實體。

地址空間:進程內的一個執行單元;進程至少有一個線程;它們共享進程的地址空間;而進程有自己獨立的地址空間;

資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源

線程是處理器調度的基本單位,但進程不是.

二者均可并發執行.

2、使用線程原因
    在Linux系統下,啟動一個新的進程必須分配給它獨立的地址空間,建立眾多的數據表來維護它的代碼段、堆棧段和數據段,這是一種"昂貴"的多任務工作方式。而運行于一個進程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分數據,啟動一個線程所花費的空間遠遠小于啟動一個進程所花費的空間,而且,線程間彼此切換所需的時間也遠遠小于進程間切換所需要的時間。
    線程間方便的通信機制。對不同進程來說,它們具有獨立的數據空間,要進行數據的傳遞只能通過通信的方式進行,這種方式不僅費時,而且很不方便。線程則不然,由于同一進程下的線程之間共享數據空間,所以一個線程的數據可以直接為其它線程所用,這不僅快捷,而且方便。


3、線程操作的函數
#include   
int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*func) (void *), void *arg);
int pthread_join (pthread_t tid, void ** status);
pthread_t pthread_self (void);
int pthread_detach (pthread_t tid);
void pthread_exit (void *status);

pthread_create:用于創建一個線程,成功返回0,否則返回Exxx(為正數)。
pthread_t *tid:線程id的類型為pthread_t,通常為無符號整型,當調用pthread_create成功時,通過*tid指針返回。

const pthread_attr_t *attr:指定創建線程的屬性,如線程優先級、初始棧大小、是否為守護進程等。可以使用NULL來使用默認值,通常情況下我們都是使用默認值。

void *(*func) (void *):函數指針func,指定當新的線程創建之后,將執行的函數。

void *arg:線程將執行的函數的參數。嵌入式系統學習意義氣嗚嗚吧久零就易,如果想傳遞多個參數,請將它們封裝在一個結構體中。

pthread_join:用于等待某個線程退出,成功返回0,否則返回Exxx(為正數)。
pthread_t tid:指定要等待的線程ID

void ** status:如果不為NULL,那么線程的返回值存儲在status指向的空間中(這就是為什么status是二級指針的原因!這種才參數也稱為“值-結果”參數)。

pthread_self:用于返回當前線程的ID。
pthread_detach:用于是指定線程變為分離狀態,就像進程脫離終端而變為后臺進程類似。成功返回0,否則返回Exxx(為正數)。變為分離狀態的線程,如果線程退出,它的所有資源將全部釋放。而如果不是分離狀態,線程必須保留它的線程ID,退出狀態直到其它線程對它調用了pthread_join。
pthread_exit用于終止線程,可以指定返回值,以便其他線程通過pthread_join函數獲取該線程的返回值。
void *status:指針線程終止的返回值。

4、線程間互斥
    使用互斥鎖(互斥)可以使線程按順序執行。通常,互斥鎖通過確保一次只有一個線程執行代碼的臨界段來同步多個線程。互斥鎖還可以保護單線程代碼。
int pthread_mutex_lock(pthread_mutex_t * mptr);  
int pthread_mutex_unlock(pthread_mutex_t * mptr);

先聲明一個pthread_mutex_t類型的變量,用作下面兩個函數的參數。在對臨界資源進行操作之前需要pthread_mutex_lock先加鎖,操作完之后pthread_mutex_unlock再解鎖。


5、線程間同步
條件變量:使用條件變量可以以原子方式阻塞線程,直到某個特定條件為真為止。條件變量始終與互斥鎖一起使用。對條件的測試是在互斥鎖(互斥)的保護下進行的。
#include   
int pthread_cond_wait(pthread_cond_t *cptr, pthread_mutex_t *mptr);  
int pthread_cond_signal(pthread_cond_t *cptr);  
//Both return: 0 if OK, positive Exxx value on error

pthread_cond_wait用于等待某個特定的條件為真,pthread_cond_signal用于通知阻塞的線程某個特定的條件為真了。在調用者兩個函數之前需要聲明一個pthread_cond_t類型的變量,用于這兩個函數的參數。
/*
是否熟悉POSIX多線程編程技術?如熟悉,編寫程序完成如下功能:
  1)有一int型全局變量g_Flag初始值為0;
  2)在主線稱中起動線程1,打印“this is thread1”,并將g_Flag設置為1
  3)在主線稱中啟動線程2,打印“this is thread2”,并將g_Flag設置為2
  4)線程序1需要在線程2退出后才能退出
  5)主線程在檢測到g_Flag從1變為2,或者從2變為1的時候退出

本文地址:http://m.qingdxww.cn/thread-520649-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲AV久久无码精品九号软件| 欧美一级特黄aaaaaa在线看片 | 亚洲一区二区三区高清 不卡| 欧洲真实呦女网站| 又爽又黄无遮挡高清免费视频| 午夜私人影院在线观看| 足恋调教丝袜视频网站| 男女啪啪抽搐呻吟高潮动态图| 伊人影院香蕉久在线26| 亚洲国产日本| 亚洲网站视频在线观看| 在线免费看| 免费看成人毛片| 日本一道在线观看| 色播影视| 亚洲精品第一卡2卡3卡4卡5卡| 18禁止看的免费污网站| 琪琪色在线播放| 亚洲精品乱码久久久久久麻豆| 日本高清久久| 伊人影视网| 91精品国产品国语在线不卡| 琪琪色原网20岁以下热热色原网站| 四虎国产精品高清在线观看| 日本免费人成在线网站| 婷婷色婷婷| 国产精品v片在线观看不卡| 亚洲涩福利高清在线| 青青在线国产视频| 亚洲床戏| 中文字幕精品视频在线观看| 秋秋影视午夜福利高清| 日韩在线观看视频免费| 性欧美高清精品video| 在线观看国产一区亚洲bd | 特级非洲黑人一级毛片| 国产精品福利电影| 中文在线无码高潮潮喷在线| 亚洲精品在线影院| 孕妇三片高清在线观看| ca88亚洲城娱乐|