This project is read-only.

Очередь.

Jun 5, 2011 at 7:42 PM

Необходимо реализовать очередь, куда, очевидно, будут добавляться данные с датчика. Ответственные: Александр, Алена.

Jun 5, 2011 at 8:30 PM

Делаю, только пока в оффлайне

Jun 5, 2011 at 10:51 PM

За вами класс SefeQueue. Методы не удалять - они нужны для синхронизации потоков. Добавлять - добавляйте свободно. И еще одна просьба. Не изменять классы предметной области и тем более не удалять их.

Jun 5, 2011 at 10:53 PM

В классе QueueItem убрать переменную TimeInMS.

Добавить общий класс - контейнер, который будет содержать пока что переменную типа double(для таскаемых данных) и __int64(возможно для времени, я до конца не уверен понадобиться ли оно нам или нет)

Jun 6, 2011 at 11:11 AM

Александр:

Почему то вчера не скинулось, ниче не понимаю как работать этой фигней=)))

Я удалил классы потому что они оказались не понятными, но впредь буду оповещать! Методы я не удалял, просто закоментил так какони у меня поместились в двух других, просто слишком много проверок получается, а так у нас будет просто очередь которая сама следить за заполнением и выполняет синхронизацию, и иза за этого не нужно всяких блокировок, проверено на собственном опыте. Антон, не много не понял про общий класс, поясни подробней.

 

Методы пнужны для синхронизации ПОТОКОВ МОДЕЛИ, а не очереди.

 

реализация типа:

if (head == tail) return NULL; // очередь пуста

Плоха тем, что поток читающий из очереди вынужден будет проводить лишнюю проверку. Здесь надо использовать критическую секцию, лучше мьютекс, а еще лучше событие. Так как это позволяет засыпать потоку до срабатывания события или высвобождения мьютекса.

К тому же ни в каком из методов не увидел воопще никакой синхронизации, т.к. постановка и извлечение из очереди должны быть атомарными операциями.

Jun 6, 2011 at 2:18 PM

Антон я не согласен с твоим решением, т.к. при использовании мьютекса и критической секции критическим ресурсом будет являться сама очередь, а не элемент. Таким образом будет исполняться один поток (записывать или читать), а остальные все ожидать его исполнения. А в моем случаи критическим ресурсом будет являться элемент очереди, поэтому никаких блокировок использовать не нужно. Благодоря этому время исполнения этого кода будет лучше и быстрее, чем при использования мьютекса.  

Jun 6, 2011 at 2:46 PM

Александр, я прекрасно понимаю о чем Вы. Об этом я говорил в личной переписке:

Александр

Нам в проекте важно последовательность и время потокобезопасной очереди??
Ну то есть обычный алгоритм вкелючает в себя то что один поток читает/пишет, а все остальные ждут, я могу попробывать сделать так один пишет, другой читает и не будет такой задержки. Если это не важно, то можно начхать и я напишу обычный алгоритм, если важно время выполнения методов очереди, тогда посижу почитаю документацию и сделаю

Антон

если количество элементов в очереди больше одного то многопоточно, если 1 или 0, то только один поток работает с очередью. На время выполнения можешь не оглядываться по точности измерений у нас большой запас

Однако. Все кроме слов "критическим ресурсом будет являться сама очередь, а не элемент", показывает Ваше полное не знание основ многопоточного программирования.

А само высказывание "критическим ресурсом будет являться сама очередь, а не элемент" крайне спорно и во многом зависит от прямоты рук программиста.

Jun 7, 2011 at 7:53 AM

Да, уже лучше. Но этот код написан так как бы ты хотел чтобы он работал, а работать он будет не так как это задумано. Добавь мьютекс в pop.

И раскоментируй мои функции, потом узнаешь для чего они.

Jun 7, 2011 at 8:01 AM

К сожалению у меня очередь не работает изза отсутствия типа 

QueueData<>.