Linux 線程實(shí)現(xiàn)

      網(wǎng)友投稿 932 2025-04-01

      目錄


      一、概念

      二、線程實(shí)現(xiàn)

      1、創(chuàng)建并運(yùn)行

      2、共同操作數(shù)據(jù)示例

      3、互斥對象mutex

      4、帶參線程

      一、概念

      先了解一下進(jìn)程,進(jìn)程是系統(tǒng)中程序執(zhí)行和資源分配的基本單位。每個進(jìn)程有自己的數(shù)據(jù)段、代碼段和堆棧段。

      而線程通常叫做 “輕量級進(jìn)程”,一個進(jìn)程可以有多個線程,它和同進(jìn)程中的其他線程共享進(jìn)程空間(堆代碼、數(shù)據(jù)、文件描述符、信號等),只擁有自己的棧空間,關(guān)系如下圖示例。

      線程也主要呈現(xiàn)三種狀態(tài):運(yùn)行態(tài)、阻塞態(tài)、就緒態(tài)。

      在同一個進(jìn)程下,每個線程都有獨(dú)立的ID,一般用tid表示。

      二、線程實(shí)現(xiàn)

      在c++11引入了一個多線程類std::thread,使用時(shí)需包含頭文件

      示例編譯:g++?-std=c++11?-pthread?thread.cpp -o thread

      1、創(chuàng)建并運(yùn)行

      (1) 寫一個普通函數(shù),用來給線程執(zhí)行

      void?t1(void){ ????for(int?i=0;i<10;i++){ ????????cout<<"this?is?thread1?+?"<

      (2)創(chuàng)建線程

      thread?thread1(t1);//創(chuàng)建

      但是,創(chuàng)建之后線程不會立即運(yùn)行,只有在join或detach指定運(yùn)行方式之后才能運(yùn)行。

      (3)join或detach

      #include? #include? #include? using?namespace?std; void?t1(void){ ????for(int?i=0;i<10;i++){ ????????cout<<"this?is?thread1?+?"<

      運(yùn)行結(jié)果:

      join方式

      可以看到創(chuàng)建線程之后,子線程沒有立即執(zhí)行,但主線程執(zhí)行了①,在join之后,可以看出,子線程運(yùn)行了②,但主線程沒有運(yùn)行,直到子線程結(jié)束之后,主線程才執(zhí)行了③。

      因?yàn)閖oin會使主線程阻塞,運(yùn)行子線程,等到子線程結(jié)束,主線程才會繼續(xù)運(yùn)行。如下圖所示。

      detach方式

      Linux 線程實(shí)現(xiàn)

      這時(shí)可以發(fā)現(xiàn),使用detach方式之后,子線程的輸出和主線程的輸出會有重合的現(xiàn)象,并且,子線程明顯沒有完全執(zhí)行完。

      因?yàn)閐etach是一種讓主線程和子線程并行運(yùn)行的方式,并且主線程不會等到子線程執(zhí)行完才結(jié)束,主線程運(yùn)行結(jié)束,同時(shí)會連帶著殺死子線程。如下圖所示。

      2、共同操作數(shù)據(jù)示例

      #include? #include? #include? using?namespace?std; int?a=0; void?t1(void){ ????for(int?i=0;i<5;i++){ ????????sleep(1); ????????cout<<"this?is?thread1?+?"<

      兩個線程可以共同操作變量a,運(yùn)行結(jié)果:

      但這是加入sleep規(guī)定了順序,如果不加,輸出會出現(xiàn)錯誤,極端情況下,a的值可能會重復(fù)輸出,如下圖所示。

      這時(shí)可以使用互斥對象來避免。

      3、互斥對象mutex

      使用mutex需要包含頭文件,mutex可以保護(hù)一段代碼完整的被執(zhí)行

      int?a=0; mutex?mu; void?t1(void){ ????for(int?i=0;i<5;i++){ ????????mu.lock(); ????????cout<<"this?is?thread1?+?"<

      加入mutex運(yùn)行結(jié)果:

      4、帶參線程

      thread 線程名(線程函數(shù)名,參數(shù)列表);

      #include? #include? #include? #include? using?namespace?std; void?t1(const?char?*a){ ????cout<<"線程參數(shù):"<

      運(yùn)行結(jié)果:

      IoT Unix C++

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:excel 為什么點(diǎn)保存就無響應(yīng)(excel表格怎么排序)
      下一篇:Excel中兩個工作表對比不同的操作技巧(excel比對兩個工作表的數(shù)據(jù)差異)
      相關(guān)文章
      亚洲av高清在线观看一区二区 | 日日噜噜噜噜夜夜爽亚洲精品| 亚洲毛片在线免费观看| 在线观看国产区亚洲一区成人| 亚洲国产成人a精品不卡在线| 国产精品无码亚洲一区二区三区| 亚洲男同gay片| 亚洲精品乱码久久久久蜜桃| 亚洲欧美日韩中文无线码 | 久久精品国产亚洲精品| 精品国产亚洲一区二区在线观看| 亚洲精品天堂成人片?V在线播放| 亚洲精品无码成人片在线观看| 亚洲欧洲日产国码高潮αv| 亚洲综合色视频在线观看| 国产成人精品日本亚洲专区61| 国产亚洲精品无码专区| 亚洲女初尝黑人巨高清| 亚洲国产成人片在线观看| 无码乱人伦一区二区亚洲| 久久久久亚洲精品天堂| 亚洲精品国产专区91在线| 亚洲一区二区三区播放在线 | 久久久久亚洲精品无码网址| 亚洲乱亚洲乱妇无码麻豆| 久久亚洲国产成人亚| 久久亚洲sm情趣捆绑调教| 亚洲国产中文在线二区三区免| 亚洲乱码在线视频| 亚洲欧美日韩中文二区| 国产精品亚洲专区在线播放| 区三区激情福利综合中文字幕在线一区亚洲视频1| 亚洲福利精品电影在线观看| 国外亚洲成AV人片在线观看| 亚洲成AV人片一区二区密柚| 久久精品国产亚洲av高清漫画| 亚洲fuli在线观看| 亚洲AV噜噜一区二区三区| 亚洲欧洲精品成人久久奇米网| 情人伊人久久综合亚洲| 亚洲色偷偷偷网站色偷一区|