C 多執行緒(一)

2021-07-10 17:42:40 字數 1587 閱讀 4724

這篇文章其實是對morewindows文章中 [1] 的乙個問題的思考。

下面是他文章的原始碼

#include #include volatile long g_nlogincount; //登入次數

unsigned int __stdcall fun(void *ppm); //執行緒函式

const dword thread_num = 50;//啟動執行緒數

dword winapi threadfun(void *ppm)

int main()

return 0;

}

問題:把執行緒數改為100,會發生什麼?

我**中程序數改為100,後發現輸出全為零,後用二分法找到64這個分界點。

剛開始覺得應該分配給程序的資源不夠導致因執行緒過多產生的棧空間超過了程序的記憶體。

我開始嘗試改一下**

#include #include volatile long g_nlogincount; //登入次數

unsigned int __stdcall fun(void *ppm); //執行緒函式

const dword thread_num = 100;//啟動執行緒數

dword winapi threadfun(void *ppm)

int main()

waitformultipleobjects(thread_num, handle, true, infinite);

printf("有%d個使用者登入後記錄結果是%d\n", thread_num, g_nlogincount);

這個有點慢可以了。

這時候,還是認為是資源問題。

預設情況下,乙個執行緒的棧要預留1m的記憶體空間,而乙個程序中可用的記憶體空間只有2g,所以理論上乙個程序中最多可以開2048個執行緒。

我發現我的兩個錯誤,一是,程序空間可以佔據os分給使用者態的全部記憶體。二是,記憶體足夠用,不止64。

再回去看博文,發現博主給的答案。

msdn上對waitformultipleobjects()函式第乙個引數作了說明:the maximum number of object handles is maximum_wait_objects(64)。

求心理陰影~~我實在沒考慮過那個函式!

我在 標頭檔案winnt.h 發現這個定義:

原來是這個原因。

另外還有一點,

「這樣執行緒a所所主要計算的值就被執行緒b修改了」這句話應該是不對的

引起問題的原因應該是:a執行到第二句,執行b,假設b執行結束後,繼續執行a,其實暫存器eax是會恢復到a最後的值,這樣導致的結果是執行緒b的執行結果被a覆蓋,相當於b沒有執行

回答:每個執行緒的暫存器是私有的,切換執行緒時會儲存各暫存器中的值。

[1] . 

[2] . 

C 多執行緒(一)

0 引言 多執行緒技術作為.net中的重要設計元素,受到了大量的關注,在.net歷次的版本更新中被不斷地拓展。隨著多執行緒庫的不斷擴充,充分利用多執行緒工具使其發揮最佳作用變得越來越困難。接下來將寫一些列關於多執行緒的文章,描述一些關於現實世界中多執行緒的思考,以及處理這些多執行緒問題的策略與方法。...

C 多執行緒 一

include includeusing namespace std void func int main 輸出 分析 主線程先執行,到了th.join 時阻塞住,建立了乙個新的子執行緒,執行子執行緒,子執行緒執行完,阻塞解除,執行主線程至結束。對以上 進行改動 include includeusi...

C 多執行緒(一) 簡介

多執行緒是為了同步完成多項任務,不是為了提高執行效率,而是為了提高資源使用效率來提高系統的效率。執行緒是在同一時間需要完成多項任務的時候實現的。乙個程式開始執行時,它就是乙個程序,程序所指包括執行中的程式和程式所使用到的記憶體和系統資源。而乙個程序又是由多個執行緒所組成的,執行緒是程式中的乙個執行流...