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

一、概念
二、線程實(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? 運(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方式 這時(shí)可以發(fā)現(xiàn),使用detach方式之后,子線程的輸出和主線程的輸出會有重合的現(xiàn)象,并且,子線程明顯沒有完全執(zhí)行完。 因?yàn)閐etach是一種讓主線程和子線程并行運(yùn)行的方式,并且主線程不會等到子線程執(zhí)行完才結(jié)束,主線程運(yùn)行結(jié)束,同時(shí)會連帶著殺死子線程。如下圖所示。 2、共同操作數(shù)據(jù)示例 #include? 兩個線程可以共同操作變量a,運(yùn)行結(jié)果: 但這是加入sleep規(guī)定了順序,如果不加,輸出會出現(xiàn)錯誤,極端情況下,a的值可能會重復(fù)輸出,如下圖所示。 這時(shí)可以使用互斥對象來避免。 3、互斥對象mutex 使用mutex需要包含頭文件 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? 運(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)容。