C 多執行緒(二)

2021-09-30 07:48:56 字數 1780 閱讀 2219

c/c++ runtime 多執行緒函式

一 簡單例項

主線程建立2個執行緒t1和t2,建立時2個執行緒就被掛起,後來呼叫resumethread恢復2個執行緒,使其開始執行,呼叫waitforsingleobject等待2個執行緒執行完,然後推出主線程即結束程序。

二解釋1)如果你正在編寫c/c++**,決不應該呼叫createthread。相反,應該使用visualc++執行期庫函式_beginthreadex,推出也應該使用_endthreadex。如果不使用microsoft的visualc++編譯器,你的編譯器**商有它自己的createthred替代函式。不管這個替代函式是什麼,你都必須使用。

2)因為_beginthreadex和_endthreadex是crt執行緒函式,所以必須注意編譯選項runtimelibaray的選擇,使用mt或mtd。

3) _beginthreadex函式的引數列表與createthread函式的引數列表是相同的,但是引數名和型別並不完全相同。這是因為microsoft的c/c++執行期庫的開發小組認為,c/c++執行期函式不應該對windows資料型別有任何依賴。_beginthreadex函式也像createthread那樣,返回新建立的執行緒的控制代碼。

下面是關於_beginthreadex的一些要點:

•每個執行緒均獲得由c/c++執行期庫的堆疊分配的自己的tiddata記憶體結構。(tiddata結構位於mtdll.**件中的visualc++源**中)。

•傳遞給_beginthreadex的執行緒函式的位址儲存在tiddata記憶體塊中。傳遞給該函式的引數也儲存在該資料塊中。

•_beginthreadex確實從內部呼叫createthread,因為這是作業系統了解如何建立新執行緒的唯一方法。

•當呼叫createtthread時,它被告知通過呼叫_threadstartex而不是pfnstartaddr來啟動執行新執行緒。還有,傳遞給執行緒函式的引數是tiddata結構而不是pvparam的位址。

•如果一切順利,就會像createthread那樣返回執行緒控制代碼。如果任何操作失敗了,便返回null。

•然後該資料塊被釋放,而作業系統的exitthread函式被呼叫,以便真正撤消該執行緒。當然,退出**要正確地設定和傳遞。

5)雖然也提供了簡化版的的_beginthread和_endthread,但是可控制性太差,所以一般不使用。

6)執行緒handle因為是核心物件,所以需要在最後closehandle。

7)更多的api:handle getcurrentprocess();handle getcurrentthread();dword getcurrentprocessid();dword getcurrentthreadid()。dword setthreadidealprocessor(handle hthread,dword dwidealprocessor);bool setthreadpriority(handle hthread,int npriority);bool setpriorityclass(getcurrentprocess(),  idle_priority_class);bool getthreadcontext(handle hthread,pcontext pcontext);bool switchtothread();

三注意1)c++主線程的終止,同時也會終止所有主線程建立的子執行緒,不管子執行緒有沒有執行完畢。所以上面的**中如果不呼叫waitforsingleobject,則2個子執行緒t1和t2可能並沒有執行完畢或根本沒有執行。

2)如果某執行緒掛起,然後有呼叫waitforsingleobject等待該執行緒,就會導致死鎖。所以上面的**如果不呼叫resumethread,則會死鎖。

C 多執行緒(二)

每次建立乙個執行緒,都會花費幾百微秒級別的時間來建立乙個私有的區域性棧,每個執行緒預設使用1m的記憶體。這個可以在使用thread類的建構函式時設定 new thread new threadstart go 2 new thread new parameterizedthreadstart go ...

c 多執行緒 二

c 11 是 2011 年 9 月 1 號發布的。c 11 在 c 03 的基礎上做了大量的改進,引入了很多新的特性,比如 lambda 表示式,右值引用,統一的列表初始化方式,正規表示式等等。當然,其中最令人激動的特性是新標準引入了原子操作類和執行緒支援庫。c 一直在語言層面缺少對多執行緒的支援,...

C 多執行緒系列(二)

static void main string args thread.start console.readkey static void threadone string content static void main string args static void threadone obje...