執行緒間同步,需要等待。等待對於同步的重要性是不言而喻的。
考慮乙個工廠的流水線,假設工序1和工序2沒有關聯,那麼找兩個工人各幹的就可以,這兩個工人都可以不認識對方。
現在考慮的重點是工序1和工序2有關聯。那麼兩個工序就需要某種形式的溝通和同步。
第一種情況:工序1進行到某個時間點時,需要工序2結束。
1)工序1暫停,在工序1上幹活的工人可以暫時離開這個工序,去休息,或去別的地方幫忙。
2)工序2加緊趕工。
3)工序2完成。
4)經理通知工序1繼續,指派乙個工人去做工序1。
這種同步的特點是:
1)工序1停工等待(join())。
2)當工序1繼續時(從join()呼叫返回),工序2在的事情已經完成。
4)工序2的工作完整成果對工序1可見。
第二中情況:工序1和工序2需要獨佔乙個公共資源,比如去原料倉庫取貨。
1)工序2的工人(他代表工序2)來到倉庫取貨,管理員讓他進入拿貨,清點,並作登記。
2)工序1的工人知道倉庫一次只能去乙個人,就坐在那裡等待(或去其它地方幫忙),實際上等同於工序1暫停了。
3)工序2的工人取貨回來。
4)工序1的工人才能去倉庫取貨。
這種同步的特點是:
1)工序1進入倉庫(lock())這個過程很長,可能會長時間等待,甚至可能要排隊。
2)工序2的倉庫中出來(unlock()),工序1才能完成進入倉庫事件(lock())。
3)工序2.拿料事件e發生在工序2.離開倉庫事件之前,工序1.拿料事件f發生在工序1.進入倉庫事件之後
5)工序2在倉庫中的所有活動結果對工序1可見。例如:工序1的人可以看到,工序2的人拿走一大半原料,因此影響到自己只能拿很少的原料了。
第三種情況:工序1和工序2需要某種「快速的「完成通知。
1)工序1的人不停的盯著乙個指示燈
2)工序2的人把生產出的半成品放入堆放區
3)工序2的人點亮指示燈
4)工序1的突然注意到指示燈亮了
5)工序1的人去堆放區取出半成品
這種同步的特點是:
1)工序1的人要經常盯著指示燈
2)工序1的人可以不停工
3)工序2中,事件順序為:半成品製作->推送到堆方區->開啟指示燈
4)工序1中,事件順序為:發現指示燈亮->從堆放區取東西->處理半成品
執行緒間同步
1.臨界區 當多個執行緒訪問乙個獨占性共享資源時,可以使用臨界區物件。擁有臨界區的執行緒可以訪問被保護起來的資源或 段,其他執行緒若想訪問,則被掛起,直到擁有臨界區的執行緒放棄臨界區為止。2.原子操作原理 單cpu可以暫時遮蔽全部中斷,多cpu通過指令來保證同一時刻只有乙個cpu對其進行操作 1.事...
程序執行緒間同步
一 posix訊息佇列 通過固定名稱來建立和引用訊息佇列 1.可以認為是乙個訊息鍊錶,有足夠的許可權的執行緒可以往佇列中放置和獲取訊息。2.可指定優先順序 在空佇列放置訊息時候能夠產生乙個訊號或啟動乙個執行緒 3.建立訊息佇列mq open mq close 關閉 並不刪除 mq unlink 刪除...
執行緒間的同步
因為之前對執行緒的同步不是很清晰,並且也沒有怎麼重視,其實就是懶得動手,正好現在沒事所以練習一下。首先用到的幾個函式 handle hthread createthread null,0,fun,null,0,null 建立執行緒 fun的實現在下面貼出來 hmutex createmutex nu...