在工作的任務中,需要對客戶端和服務端 通訊包進行落地。把這個做成通用的模組,在高併發和多執行緒下,也能夠工作。
在查閱了大眾化日誌方案後,決定採用:寫日誌和寫檔案分離的方式進行。大概內容圖:
需要記錄是通訊包,將需要記錄的通訊包推送到佇列,再由乙個專門的執行緒去讀取佇列,將出佇列的資料寫到檔案中。這樣將每次直接io瓶頸,轉化成儲存佇列的大小,瓶頸變成了記憶體的大小。上**:
// 掃瞄佇列,寫檔案的執行緒
private static readonly thread logthread;
// 自定義執行緒安全的queue
private static readonly concurrentqueuelogqueue;
// 多執行緒下,操作統一資源的鎖
private static readonly object syncroot;
// 在佇列沒有資料時,執行緒停止掃瞄標誌
private static readonly autoresetevent autoreset = null;
複製**
// 建構函式
static utils
()複製**
// 記錄日誌
public static void log(listmsg)
// 啟用掃瞄停止的執行緒(發出訊號)
autoreset.set();
}複製**
// 寫入日誌
private static void writelog
() }
else
}ist.clear();
}// 在這裡,執行緒會被暫停,直到收到訊號;
autoreset.waitone();}}
}複製**
// 寫檔案
private static void processwritelog(message msg)
catch (exception ex)
", ex.message));
}}複製**
autoresetevent關鍵字
有點類似於計算機中的訊號量,回顧《作業系統》中的訊號量吧,什麼銀行家演算法,什麼訊號量已經忘得一乾二淨了。
訊號量用在多執行緒多工同步的,乙個執行緒完成了某乙個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作。
互斥鎖是用在多執行緒多工互斥的,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法訪問,直到這個執行緒unlock,其他的執行緒才開始可以利用這個資源
C 中的long與C 中的long
微軟很厲害,c 是非常優秀的計算機語言,c 比c 還厲害,c c 本身不就包含四個 號嗎?而微軟發明了c c 中的long比c 中的long要long兩倍!不信你看 我正在使用.net寫乙個預約排隊的程式,因為一前通過vc編寫了乙個用於顯示登記資訊的控制項,現在使用c 重新預約程式,則必然要呼叫vc...
c中的const與c 中的const
c中的const是乙個偽唯讀識別符號。include include int main 此時輸出a的值為20,被指標間接的改變了。c 中,const進行了增強,不在是乙個偽識別符號了。const int a 10 int p int a p 20 cout a p endl cout a endl ...
C 中的const 和C中的區別
c 中的const 一 和c中的區別 c 中的const正常情況下是看成編譯期的常量,編譯器並不為const分配空間,只是在編譯的時候將期值儲存在名字表中,並在適當的時候折合在 中.所以,以下 include using namespace std int main for int i 0 i si...