-
[1] MyThread 繼承自 Thread 類,但 start 方法被你覆蓋,[2] 呼叫你覆蓋的 start() 方法,所以它不會生成執行緒,也不會被呼叫。
1] MyRunnable 實現了 runnable 介面。
2] 但是自定義啟動方法不會生成執行緒,也不會被呼叫;
1] NewTread 屬於 Thread 類,它只引用方法,不處理方法。
2] 是呼叫執行緒類的 start() 方法,而不是呼叫 [3] 呼叫執行緒類的 start() 方法後,生成乙個新執行緒,然後呼叫該方法。
-
好吧,讓我們簡單地說。
所有資源都由對映到記憶體位址的指標進行管理。 當編譯的**在託管環境中執行時,其所有*可變*資源都受到嚴格管理並單獨儲存。 在你的例子中,即使我開啟執行緒 A 10 次讓它們一起執行,實際上它們執行的*機器程式碼*是一樣的,區別在於資源不同,有的堆積在記憶體中,有的被 CPU 從暫存器中取出,有的被扔進檔案快取中, 等(公共資源不計算在內)。
沒有任何人做二手**這回事,執行緒狀態的儲存遠沒有CPU排程和狀態恢復那麼簡單。 從表面上看,其實CPU就是個忙著吃的,按照編譯好的**來解釋和執行,跑來跑去拿資源、算資源、寫資源,本身就沒什麼可提倡的,一切都是計畫好的。
為什麼你經常說你應該注意鎖、互斥鎖和原子操作,我想你知道這一點。 不管你的A執行緒現在在哪裡,B執行緒不小心修改了大家在意想不到的時間可以訪問的公共資源,這對A來說簡直是一場災難,竊聽無非是A根本無法**資源的價值,焦點就會被搶占甚至死卡。
以我的拙見,看看就知道了。
剛在一樓見到你的問題。
鎖定是一種保護*可能*意外訪問的公共資源的方法;
每個執行緒體都有自己的一塊土地(記憶體),當你寫執行緒 thd=new thread(..,系統給它分配了初始記憶體空間,用來儲存一些關於執行緒本身的資訊(比如執行緒的當前狀態等),當然還有很多隱藏的東西是框架管理的,我們看不到的。 當您再次開啟執行緒 B 時,它有自己的空間。
公共資源本質上是儲存在記憶體中,任何知道記憶體頭的位址以及儲存在其中的東西型別的人都可以讀寫。 鎖定是附加要求,在訪問此級別的獨佔檢查之前必須通過。 你為什麼不濫用公共資源,因為如果你不鎖定它,你不知道它什麼時候會被誰改變; 在每次訪問之前,您的鎖將消耗額外的系統資源進行檢查。
當然,鎖的種類很多,有的可以讓我同時寫和讀,有的獨佔的甚至沒有辦法讀,還有更高效的原子運算直接在暫存器中計算,不用鏈,但同樣可以達到乙個人“瞬間”壟斷的效果。
-
讓我們舉乙個簡單的例子。
假設您的銀行卡中有 1,000 美元。
在你在外面花錢刷卡的同時,其他人也同時向你的賬戶匯款。
如果銀行的系統沒有鎖定機制,並且支出和儲存同時發生,那麼您的帳戶餘額就會混亂。
如果你花了500,有人給你發了500沒有鎖,而且兩者同時發生(雖然這個概率極低,但不能排除),那麼很有可能你的賬戶餘額是1500或者500,其實你的賬戶應該還是1000
刷卡和儲存可以看作是兩條線,兩條線都在爭奪你的銀行卡餘額的公共資源,無論你的賬戶餘額是1500還是500,這取決於兩者中哪乙個先爭奪你賬戶卡中的餘額資料。
因此,在這種情況下,必須將其鎖定,並且只能同時操作一張銀行卡餘額進行消費和儲存。
-
沒有一種語言會改變程式設計師的**,你說的應該是你定義的變數,這取決於你定義的範圍,比如乙個全域性變數,執行緒可以通過它進行通訊,a改b改b會用新資料,b改a會用新資料,沒人會迴轉, 這些是儲存而不是 cpu 的東西,而這個全域性變數所在的區域是公共資源,如果它沒有被鎖定,A 改變了這個變數,但它在執行之前被 B 改變了,它肯定不會對 A 起作用,所以子邏輯是混亂的。
-
該程式存在執行緒同步問題。
執行緒同步是乙個系統的過程,包含廣泛的問題。 多執行緒程式設計需要巧妙地使用執行緒同步機制來解決資源爭用、互斥、協調、死鎖等各種問題。 如果必須使用多執行緒,則必須系統地掌握執行緒同步程式設計的方法。
建議先學習一本作業系統教材的多執行緒章節,了解整個知識脈絡(推薦“現代作業系統”,很不錯); 我們來了解一下 Windows 在多執行緒方面提供的執行緒同步物件和同步 API; 如果您使用的是 VC,請了解 MFC 如何封裝執行緒同步 API。
當然,你也可以發布**給大家幫忙找出問題所在。
-
可能是程式的三個執行緒在雙核 CPU 上同時執行,偶爾會導致資料衝突。
-
使用 waitforsingleobject 函式? 此函式在呼叫它時輸出返回值,有時它會失敗。
其中,可以使用 threadid 來確定執行緒操作的資料 ID,可以使用範圍內的資料。 例如,threadid=1 操作資料庫 ID 1-1000 中的資料,然後在此範圍內執行正常的資料庫操作。 >>>More
簡單的方法是設定乙個關鍵變數,執行緒在執行時檢測這個變數的值,如果變數的值為false,則表示執行緒暫停,讓執行緒繼續休眠,可以根據自己的需要設定休眠間隔值。 比較複雜的是執行緒間通訊來控制,我想大家已經看過很多了,我就不多說了。網上有很多例子。 >>>More
當電腦執行時,它不僅開啟的程式會占用CPU,即使你在電腦上什麼都不做,也有很多看不見的後台程式在執行,少則十幾個,有時甚至幾十個。 防毒軟體、系統監控程式等都會占用CPU,但這只是CPU資源大小的問題。 >>>More