Несколько-писателей ориентированная на многопотоковое исполнение очередь в C

Я не знаком с GWT, но я очень знаком с Flex. Даже при том, что GWT основан на Java (и он кажется, что Вы - в основном магазин Java), я рекомендовал бы Flex на основе Ваших перечисленных интересов:

  • Futureproof - полномочия Flash YouTube и огромный процент мультимедиа в сети... они встроили его в игровые приставки, и Intel встраивает его в абонентские установки. Это будет здесь в течение долгого, долгого времени, и Adobe всегда поддерживал 100% назад совместимость с их Flash player.

  • Работы над всеми главными браузерами - да. И с Flash Player 10, который включает системы Linux также. И с очень минимальными администраторскими головными болями (путь меньше, чем Java, по-моему).

  • Быстрый & быстро реагирующий пользовательский опыт - да, хотя Java может быть быстрее в некоторых сценариях. Flash оптимизирован для векторного рендеринга, поэтому так как это - Ваша цель, это может быть, дают Вам лучшую производительность, чем Java.

  • Код должен быть тестируемой единицей - да, видеть FlexUnit.

  • Код должен быть удобным в сопровождении - определенно. AS3 является серьезным языком, не игрушечным языком сценариев. Это будет очень знакомо пользователям C# или Java.

  • Скорость & простота разработки - для того, что Вы делаете, Вы будете в состоянии найти десятки примеров точно, что Вы описали: изменение масштаба и панорамирование Google Maps - как векторные изображения. Ядро времени выполнения является хорошо разработанным графическим механизмом, так создание приложения интерактивных график является своей естественной тяжелой работой.

  • какая-то векторная графика Поддержек (SVG плюс) - очевидно, Flash делает это исходно. SVG поддерживается на этапе компиляции (можно скомпилировать в SVG, но Вы не можете проанализировать SVG во времени выполнения). Существуют наборы инструментальных средств, доступные, это преобразует SVG в SWF для Вас во времени выполнения.

[только 110] причина я видел бы использование GWT, должен будет сохранить Ваш Java магазина на сервере и клиенте..., но с другой стороны, Вы ищете лучшую технологию для задания, правильно? В этом случае я сказал бы, что Flash (и, в частности, платформа Flex) подходит лучше всего для того, что Вы желаете выполнить.

13
задан Edward 31 July 2009 в 13:45
поделиться

3 ответа

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

Итак, это стандартный вариант использования переменной условия. Сделайте себе структуру, содержащую мьютекс, переменную условия, связанный список (или кольцевой буфер, если хотите) и флаг отмены:

write:
    lock the mutex
    (optionally - check the cancel flag to prevent leaks of stuff on the list)
    add the event to the list
    signal the condition variable
    unlock the mutex

read:
   lock the mutex
   while (list is empty AND cancel is false):
       wait on the condition variable with the mutex
   if cancel is false:  // or "if list non-empty", depending on cancel semantics
       remove an event from the list
   unlock the mutex
   return event if we have one, else NULL meaning "cancelled"

cancel:
   lock the mutex
   set the cancel flag
   (optionally - dispose of anything on the list, since the reader will quit)
   signal the condition variable
   unlock the mutex

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

Изменить: вы также можете поддерживать несколько считывателей (без переносимых гарантий, для которых одно событие получает данное событие), если в отмене вы измените "сигнал" на " трансляция ". Хотя вам это и не нужно, на самом деле это тоже ничего не стоит.

16
ответ дан 1 December 2019 в 21:25
поделиться

Я бы выбрал несколько очередей с одним устройством записи (по одной на каждый поток записи). Затем вы можете проверить этот , чтобы узнать, как заставить отдельный считыватель читать различные очереди.

1
ответ дан 1 December 2019 в 21:25
поделиться

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

Mutex myQueueLock;
Queue myQueue; 
void mtQueuePush(int value)
{
    lock(myQueueLock);
    queuePush(myQueue, value);
    unlock(myQueueLock);
}
int mtQueueNext()
{
    lock(myQueueLock);
    int value = queueFront(myQueue);
    queuePop(myQueue);
    unlock(myQueueLock);
    return value;
}

Единственное, что после этого, - это добавить некоторую обработку для mtQueueNext, когда очередь пуста.

РЕДАКТИРОВАТЬ: Если у вас есть одиночный читатель, безблокирующая очередь с одним писателем, вам нужна только блокировка вокруг mtQueuePush, чтобы предотвратить одновременную запись нескольких писателей.

Существует множество одиночных безблокирующих очередей считывателя / писателя, хотя большинство из них реализовано как классы шаблонов c ++. Однако выполните поиск в Google и при необходимости подумайте, как их переписать на обычном языке C.

5
ответ дан 1 December 2019 в 21:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: