C 中的 AutoResetEvent 關鍵字

2021-09-12 01:35:40 字數 1382 閱讀 4682

在工作的任務中,需要對客戶端和服務端 通訊包進行落地。把這個做成通用的模組,在高併發和多執行緒下,也能夠工作。

在查閱了大眾化日誌方案後,決定採用:寫日誌和寫檔案分離的方式進行。大概內容圖:

需要記錄是通訊包,將需要記錄的通訊包推送到佇列,再由乙個專門的執行緒去讀取佇列,將出佇列的資料寫到檔案中。這樣將每次直接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...