我想實現一個快速記錄器,它包含日誌條目,並且當某個觸發器到達時,它將刷新最後的X條消息。我可以「強制」線程喚醒嗎?
這樣的想法是保持在一個循環緩衝區中的所有消息,一旦我們有觸發,推它的ID到隊列中,而另一線程監視(在所有系統中的一個線程)。此線程將返回X消息並刷新它們。我知道如何處理在我嘗試刷新時正在寫入的消息,在刷新正在刷新的消息之前已被覆蓋的消息,而我試圖更新它們等。
我的問題是,例如我有20個線程寫消息,只有10個內核,在2個「writer」線程執行之間的時間差,所有的緩衝區都會被覆蓋好幾次。
有沒有什麼辦法可以讓「我的」線程「強制」「編寫器」線程執行(或給它是時間片?我猜不,但是仍然... 你能建議任何其他方式/設計來克服這個問題
取決於,但一次有多個線程寫入硬盤驅動器會在硬盤驅動器達到飽和CPU處理速度之前很久就會飽和硬盤驅動器的速度。爲了簡單起見,我只有一個寫線程: - /。在任何一種情況下,互斥鎖或文件鎖將有助於確保只有1(fifo)線程可以訪問緩衝區或寫入位置。 – IdeaHat
@MadScienceDreams:是的,我有一個作家(相應地更新了問題)。但問題仍然存在,筆者有機會刷新它 – yosim
可以給該線程優先級更高,所以只要用信號(通過條件變量之前緩衝區被覆蓋,互斥,信號量,讀者,作家鎖,無論你想要什麼),系統調度程序將執行該線程。請注意,您的問題可以通過更好的設計得到更好的解決。如果你的緩衝區在沒有你的控制的情況下被覆蓋,那麼你需要重新思考你的日誌機制。 – Shahbaz