簡體   English   中英

線程安全的異步字節隊列

[英]Thread-safe async byte queue

我有一個回調方法,只要有新數據就會調用它:

public delegate void DataCallback(
    byte[] buffer,
    int offset,
    int count);

我想將它包裝在一個實現類似於此的接口的類中:

public interface IDataSource
{
    IAsyncResult BeginRead(
        byte[] buffer,
        int offset,
        int size,
        TimeSpan timeout,
        AsyncCallback callback,
        object state);

    int EndRead(
        IAsyncResult asyncResult);

    int Read(
        byte[] buffer,
        int offset,
        int size,
        TimeSpan timeout);
}

這顯然是一個典型的生產者 - 消費者問題:字節是通過調用回調方法產生的,並由Begin / EndRead和Read方法使用。 如果沒有可用的數據,則應該阻止Begin / EndRead和Read方法(直到發生超時)。 實現應該使用固定大小的內部緩沖區,因此當緩沖區當前已滿時,回調方法需要阻塞。

由於考慮多線程通常會導致嚴重的問題,我的問題是: 是否已經實現了這樣的數據結構?

(我想實現的讀法應該是很簡單的,但我想,以避免執行開始/ EndRead與讀取。 Begin / EndInvoke 。)

是否必須通過IAsyncResult異步? 這里有一個通用的阻塞隊列(即讀取器阻塞直到有數據或它被關閉;寫入器阻塞直到有空間); 它沒有專門針對byte[]進行優化,但只要大小不大就應該應對 - 但作為阻塞隊列,它需要(至少一個)專用的消費者線程,執行:

T val;
while(queue.TryDequeue(out val)) {
    // process val
}

我認為你應該在“無鎖隊列”上進行谷歌搜索。 我有很多有用的點擊方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM