這個問題可能很簡單,但我仍然無法找出一個有效的方法來做到這一點。我有以下設置:高效的多線程共享訪問內存緩衝區
1)線程A不斷地從互聯網下載數據到內存緩衝區。
2)同時,線程B想要讀取已經從這個緩衝區下載的數據。
緩衝區不是圓形或任何東西。有一個寫入遊標和一個讀取遊標。一旦線程A向緩衝區寫入了一些內容,它就會更新寫入光標,告訴線程B當前有多少數據可用於讀取。
問題是線程B經常讀取數千字節,但一次只讀取一個字節的步驟。因此,我需要一種有效的方式來同步兩個線程。我已經嘗試了SetEvent()和WaitForSingleObject(),但是這看起來很慢(或者我做了錯誤),因爲線程B正在從緩衝區讀取1個字節的數據包,所以線程B必須爲每個字節調用WaitForSingleObject需要閱讀。聽起來像很多開銷。
不可能在沒有任何互斥體(臨界區)保護的情況下執行此操作嗎?即線程B可以輪詢寫入光標,直到有足夠的數據可用,然後複製它。但是隨後會出現同步問題,即當線程A更新寫入光標時,此更改是否立即反映在線程B中?我沒有太多的多線程編程經驗,其中的許多文章聽起來都非常複雜,所以如果有人能夠以正確的方式實現這一點,我會很高興。
儘量不要這樣做。通常從網絡中以比一個字節大得多的塊讀取數據。你真的只需要使用一個緩衝區?爲什麼線程A會將大塊讀入動態分配的緩衝區結構體/實例,排隊(阻塞生產者 - 消費者隊列),緩衝區指針指向線程B,並立即爲下一次加載數據分配一個新緩衝區?不管你怎麼做,單字節的線程間通信都是非常低效的。 – 2014-12-06 20:41:29
謝謝,這就是我現在所做的:從流線程中讀取16kb的數據包,並緩存這些數據包,以便從主程序快速基於字節訪問。這是有效的,然後是投票的更好方法。 – Andreas 2014-12-07 09:57:24