Я сделал вариант классической задачи с ограниченным буфером.
Это ОЧЕНЬ отличается, и на дороге есть небольшой технический нюанс, который мне нужно знать для обеспечения безопасности потоков (вместо того, чтобы бесконечно проверять состояние, которое МОЖЕТ никогда не происходить)
Не думаю, что мне нужно объяснять ситуацию, речь идет об оценке следующего примера кода
if(buffer1.BufferNotFull)
{
buffer1.Lock();
buffer1.AddValueAtIndex(value, index);
buffer1.Unlock();
}
В основном мой buffer1 имеет простую переменную условия (обновленную и все), которая позволяет мне узнать, не заполнена ли она, и затем я получаю блокировку, выполняю магию и освобождаю блокировку.
Но могу ли я просто предположить, что оценка условия "buffernotfull" не может чередовать с другим потоком, просто записывающим через LAST-слот в моем буфере?
(буфер на самом деле представляет собой массив значений с -1, представляющий пустое, не спрашивайте, почему ^ _ ^)
Вкратце: оценка
if(buffer1.BufferNotFull)
потокобезопасный с кодом тела, запрашивающим блокировку
EDIT
Это система, которую я сейчас использую для всей моей системы. Я надеюсь, что это помогает показать мой дизайн. Примите во внимание, что я сделал этот проект исключительно для изучения этих основных механизмов синхронизации.
Поток управления для потоков, обращающихся к буферам
Чтение входного потока (синхронизация не требуется)
ПОПЫТКА:
- Операция записи из потока производителя
в буфере1 ЗАПРОС ЗАПРОСА:
- Если блокировка запрещена, продолжайте запрашивать
блокировка.
- Если переменная условия не выполняется,
ждать
- Если блокировка принята, выполнить запись
работа
- разблокировать buffer1 и уведомить других
ожидающие темы.
- Если входной поток пуст и buffer1
умереть и просить смерти от
filterthread
ПОПЫТКА:
- Операция чтения из фильтра
поток в буфере1 ЗАПРОС ЗАПРОСА:
- Если блокировка запрещена, продолжайте запрашивать блокировку
- Если блокировка принята, выполнить чтение
операция (замените значение на -1)
и сохранить значение в потоке
после применения фильтра.
- Если переменная условия не выполняется,
ждать.
- разблокировать buffer1 и уведомить других
ожидающие темы.
- Если buffer1 и buffer2 пусты и
запрос на смерть существует, умри.
ПОПЫТКА:
- Операция записи из фильтра
поток в буфере2 ЗАПРОС ЗАПРОСА:
- Если блокировка запрещена, продолжайте запрашивать блокировку
- Если блокировка принята, выполнить запись
операция (с отфильтрованным
результаты).
- Если переменная условия не выполняется,
ждать.
- разблокировать буфер2 и уведомить других
ожидающие темы.
- Если buffer1 и buffer2 пусты и
запрос о смерти существует, отправить смерть
просьба потребителя нарезать и умереть.
ПОПЫТКА:
- Операция чтения из буфера2 из
потребительская нить
- Если блокировка запрещена, продолжайте запрашивать блокировку
- Если блокировка принята, выполнить чтение
операция (замените значение на -1)
и напрямую выводить переменную
на консоль.
- Если переменная условия не выполняется,
ждать.
- Разблокировать buffer2 и уведомить других
ожидающие темы.
- Если buffer2 пуст и смерть
запрос существует, умри.
Поток управления для отдельных операций резьбы
получить блокировку
Проверьте переменную условия
Если ДА, операция записи / чтения
Если НЕТ, подождите
Разблокировка
Я соберу и протестирую последнюю часть реализации и отредактирую, чтобы увидеть, действительно ли принятый ответ принес мне результаты, но это может занять некоторое время