Потокобезопасная асинхронная байтовая очередь - PullRequest
3 голосов
/ 21 мая 2009

У меня есть метод обратного вызова, который вызывается при появлении новых данных:

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 должны блокироваться, если данные недоступны (до истечения времени ожидания). Реализация должна использовать внутренний буфер фиксированного размера, поэтому метод обратного вызова должен блокироваться, когда буфер в настоящее время заполнен.

Поскольку размышления о многопоточности обычно вызывают сильную головную боль, у меня такой вопрос: Уже существует реализация такой структуры данных?

(Я думаю, что реализация метода Read должна быть довольно простой, но я бы хотел избежать реализации Begin / EndRead с Read. Begin / EndInvoke.)

Ответы [ 2 ]

1 голос
/ 21 мая 2009

Должен ли он быть асинхронным через IAsyncResult? У меня есть общая блокировка очередь здесь (то есть блокировка считывателей до тех пор, пока не будет данных или она не будет закрыта; блок писателей пока не будет места); он не оптимизирован специально для byte[], но до тех пор, пока его размер не велик, он должен справляться - но в качестве очереди блокировки он требует (как минимум один) выделенного потока потребителя, выполняя:

T val;
while(queue.TryDequeue(out val)) {
    // process val
}
0 голосов
/ 21 мая 2009

Я думаю, вы должны выполнить поиск в Google по "очереди без блокировки". Таким образом, я получил много полезных хитов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...