在程序裏如果加了WaitForSingleObject,那麽程序到這裏就去檢測妳給他的那個句柄的狀態,如果是0程序就停在這裏了,如果是1,程序就繼續下去。
那麽線程同步就要利用這兩個狀態。假如妳有兩個線程,都有可能訪問同壹個文件,而同壹個文件是不能被兩個線程同時寫入的,那麽妳就需要在寫入之前先判斷文件有沒有被另壹個線程在寫入,如果有則等著,等另壹個線程寫完之後妳再繼續,我們不能用壹個死循壞來嘗試打開文件知道成功為止,這樣會讓CPU有非常高的占用率。
這裏妳就要創建壹個對象,這個對象有兩個狀態,我們約定,如果壹個線程要寫入文件之前就把這個對象狀態變成0,寫完之後把它變回1,那麽另壹個線程在寫文件之前只要檢測這個對象是不是為0就可以確定文件有沒有被另壹個線程在寫入了。檢測的過程就用WaitForSingleObject來操作,如果為1,WaitForSingleObject就和沒這句話壹樣立刻執行下去了,如果那個對象是個0,那麽WaitForSingleObject就會停在這裏等,等到另壹個線程寫完文件,因為那個線程在寫完文件之後會把對象變成1。
這個狀態1我們命名為有信號狀態,狀態0我們稱無信號狀態。我們就把這個對象叫做互斥體,他起到了對這個文件讀寫的互斥作用。這整個寫文件之前之後改變互斥體狀態,寫之前檢測互斥體狀態這個過程就是壹個線程的同步。
同步是編程的人自己要考慮的問題,系統不會幫妳同步,也就是說我們進行了上述的約定之後,妳在編程的時候必須要在寫入文件之前將互斥體置為無信號狀態,寫完之後置為有信號狀態。
這樣應該好懂了吧?不懂繼續追問吧。