Очередь без блокировок “несколько единственный производителями потребитель” существуют для Delphi?

Вот модификация категории, написанной iWasRobbed выше. Он сохраняет пропорции исходного изображения, а не искажает его.

- (UIImage*)scaleToSizeKeepAspect:(CGSize)size {
    UIGraphicsBeginImageContext(size);

    CGFloat ws = size.width/self.size.width;
    CGFloat hs = size.height/self.size.height;

    if (ws > hs) {
        ws = hs/ws;
        hs = 1.0;
    } else {
        hs = ws/hs;
        ws = 1.0;
    }

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, 0.0, size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    CGContextDrawImage(context, CGRectMake(size.width/2-(size.width*ws)/2,
        size.height/2-(size.height*hs)/2, size.width*ws,
        size.height*hs), self.CGImage);

    UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return scaledImage;
}
12
задан Mason Wheeler 5 July 2009 в 12:59
поделиться

4 ответа

Очередь без блокировок из OmniThreadLibrary поддерживает несколько производителей. Вы можете использовать его отдельно от библиотеки потоков (т.е. вы можете использовать модуль OtlContainers в любой другой структуре).

Как Даниэле указал ниже, в OmniThreadLibrary есть две очереди. Один в OtlContainers поддерживает нескольких производителей и нескольких потребителей, в то время как «умная» версия в OtlComm (которая является просто оболочкой для более простой версии) - только один производитель / один потребитель.

Документация по-прежнему является большой проблемой для библиотеки OmniThreadLibrary. project :(. Некоторую информацию об очереди можно найти здесь .

5
ответ дан 2 December 2019 в 21:45
поделиться

Может быть, это может быть полезно: Связанные функции SList .

3
ответ дан 2 December 2019 в 21:45
поделиться

http://svn.berlios.de/svnroot/repos/dzchart/utilities/dzLib/trunk/lockfree/

@Daniele Teti:

Читатель должен дождаться всех писатели, у которых все еще есть доступ к старой очереди для выхода из метода Enqueue. Поскольку первое, что делает читатель в методе Dequeue, - это создает новую очередь для новых писателей, которые входят в очередь, всем модулям записи, имеющим ссылку на старую очередь, не требуется много времени, чтобы выйти из очереди. Но вы правы: он свободен от блокировок только для писателей, но может по-прежнему требовать, чтобы поток чтения ждал, пока некоторые писатели выйдут из очереди.

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

Для очереди / FIFO с несколькими производителями / одним потребителем вы можете легко сделать одну LockFree с помощью SLIST или тривиального стека Lock Free LIFO. У вас есть второй «частный» стек для потребителя (который также может быть реализован в виде SLIST для простоты или любой другой модели стека по вашему выбору). Потребитель извлекает элементы из частного стека. Всякий раз, когда частный LIFO исчерпывается, вы выполняете Flush, а не Pop из совместно используемого параллельного SLIST (захват всей цепочки SLIST), а затем просматриваете очищенный список по порядку, помещая элементы в частный стек.

Это работает для одиночных операций. производитель / один потребитель и для нескольких производителей / одного потребителя.

Однако он не работает для случаев, когда несколько производителей / несколько потребителей.

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

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