用最簡單的語言說就是這個物件有兩個狀態比如我們稱0和1,稱什麼一點也不重要,有訊號和無訊號就是相對的兩個狀態,沒什麼意義,你就認為乙個狀態是0另乙個狀態是1。在程式裡如果加了waitforsingleobject,那麼程式到這裡就去檢測你給他的那個控制代碼的狀態,如果是0程式就停在這裡了,如果是1,程式就繼續下去。
那麼執行緒同步就要利用這兩個狀態。假如你有兩個執行緒,都有可能訪問同乙個檔案,而同乙個檔案是不能被兩個執行緒同時寫入的,那麼你就需要在寫入之前先判斷檔案有沒有被另乙個執行緒在寫入,如果有則等著,等另乙個執行緒寫完之後你再繼續,我們不能用乙個死循壞來嘗試開啟檔案知道成功為止,這樣會讓cpu有非常高的佔用率。
這裡你就要建立乙個物件,這個物件有兩個狀態,我們約定,如果乙個執行緒要寫入檔案之前就把這個物件狀態變成0,寫完之後把它變回1,那麼另乙個執行緒在寫檔案之前只要檢測這個物件是不是為0就可以確定檔案有沒有被另乙個執行緒在寫入了。檢測的過程就用waitforsingleobject來操作,如果為1,waitforsingleobject就和沒這句話一樣立刻執行下去了,如果那個物件是個0,那麼waitforsingleobject就會停在這裡等,等到另乙個執行緒寫完檔案,因為那個執行緒在寫完檔案之後會把物件變成1。
這個狀態1我們命名為有訊號狀態,狀態0我們稱無訊號狀態。我們就把這個物件叫做互斥體,他起到了對這個檔案讀寫的互斥作用。這整個寫檔案之前之後改變互斥體狀態,寫之前檢測互斥體狀態這個過程就是乙個執行緒的同步。
同步是程式設計的人自己要考慮的問題,系統不會幫你同步,也就是說我們進行了上述的約定之後,你在程式設計的時候必須要在寫入檔案之前將互斥體置為無訊號狀態,寫完之後置為有訊號狀態。
WaitForSingleObject的詳細用法
在多執行緒的情況下,有時候我們會希望等待某一線程完成了再繼續做其他事情,要實現這個目的,可以使用windows api函式waitforsingleobject,或者waitformultipleobjects。這兩個函式都會等待object被標為有訊號 signaled 時才返回的。那麼,訊號是什...
WaitForSingleObject的詳細用法
使用者模式的執行緒同步機制效率高,如果需要考慮執行緒同步問題,應該首先考慮使用者模式的執行緒同步方法。但是,使用者模式的執行緒同步有限制,對於多個程序之間的執行緒同步,使用者模式的執行緒同步方法無能為力。這時,只能考慮使用核心模式。windows提供了許多核心物件來實現執行緒的同步。對於執行緒同步而...
WaitForSingleObject的詳細用法
在多執行緒的情況下,有時候我們會希望等待某一線程完成了再繼續做其他事情,要實現這個目的,可以使用windows api函式waitforsingleobject,或者waitformultipleobjects。這兩個函式都會等待object被標為有訊號 signaled 時才返回的。那麼,訊號是什...