執行緒 程序同步問題

2021-06-15 18:28:18 字數 967 閱讀 8086

. 計算機網路課程實驗要做乙個c/s模型的檔案傳遞程式。本來socket程式設計我還是比較熟悉的,因為以前用vc/mfc編過乙個網路遊戲——網路五子棋,並通過設定nat與新加坡的同學對戰了一把。這次的程式本來更簡單,但是老師要用純windows api來寫,不准用其他的類庫,於是工作的重點就轉移到了怎樣構建乙個自己的支援非同步呼叫的socket類,一涉及到非同步呼叫,肯定又得用到多執行緒,所以還得構建乙個自己的執行緒類,如果有可能可以再實現乙個執行緒池來提高執行效率。

可以看出所有問題的關鍵在於實現這個執行緒類,因為其他的都是簡單的對api進行一次封裝,而執行緒類實現的好壞將直接影響到非同步呼叫的方便性和安全性。多執行緒問題中乙個最頭痛的問題便是程序同步。而我的執行緒類就要實現乙個方法thread.join()來幫助使用者同步執行緒,此方法將阻塞呼叫執行緒(即主程序)直到被調程序(子程序)執行完畢,從而達到同步的效果。

翻翻《windows核心程式設計》,找到了乙個event核心物件,可以實現程序同步,模型很簡單,乙個執行緒裡阻塞wait乙個特定的event,直到另外乙個執行緒set這個event,即觸發這個事件。但我馬上想到了乙個問題,如果在主線程等待某個事件之前,子執行緒已經觸發過了這個事件,怎麼辦?等待將會一直阻塞嗎?由於本人一時不小心,犯了乙個錯誤,導致了這個問題的驗證過程略趨複雜了一些,在此就略去,僅將答案公布於下:不會一直鎖住,如果事件已經觸發了,event提供了2種復位的方法,一種是manul(人工),即顯示呼叫函式resetevent,另一種是auto(自動),即第乙個wait此event的執行緒(或程序)得到響應之後便自動復位。所以,當事件先觸發而等待此事件的**滯後時也不會導致wait無窮阻塞,因為event自己維護了乙個自己的狀態。

這不和semphore(訊號量)一模一樣了嗎?所以這個地方,如果熟悉資訊量操作的話,就不必用這個event了。後來進一步發現,什麼mutex,event,criticalregion都是可以靠semphore來實現的,或者說是semphore使用的一些特例。所以,要學好執行緒(或程序)同步問題,學好semphore,即p,v操作才是王道!

程序同步問題

有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生 但若某個寫程序和其他程序 讀程序或寫程序 同時訪問共享資料時則可能導致資料不一致的錯誤。因此要求 允許多個讀者可以同時對檔案執行讀操作 只允許乙個寫者往檔案中寫資訊 任一寫者在完成寫操作之前不允許其他讀者或寫者工...

多執行緒程序同步

windows執行緒同步分使用者方式與核心方式 使用者方式 效率相對較高 1.原子鎖 2.關鍵段 臨界區 以下來自 windows核心程式設計 我反覆說,關鍵 段屬於使用者方式物件。實際上,這種說法並不是百分之百的正確。如果乙個執行緒試圖進入另一 個執行緒擁有的關鍵 段,那麼該執行緒就會被置於等待狀...

執行緒程序同步(二)

檔案鎖 哲學家用餐模型分析 程序間也可以使用互斥鎖,來達到同步的目的。但應在pthread mutex init初始化之前,修改其屬性為程序間共享。mutex的屬性修改函式主要有以下幾個。主要應用函式 pthread mutexattr t mattr 型別 用於定義mutex鎖的 屬性 pthre...