Russian Qt Forum
Май 22, 2024, 10:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Объясните пример по QSemaphore  (Прочитано 6275 раз)
like-nix
Гость
« : Март 27, 2011, 23:32 »

Код:
#include <QtCore>

#include <stdio.h>
#include <stdlib.h>

//! [0]
const int DataSize = 100000;
const int BufferSize = 8192;
char buffer[BufferSize];

QSemaphore freeBytes(BufferSize);
QSemaphore usedBytes;
//! [0]

//! [1]
class Producer : public QThread
//! [1] //! [2]
{
public:
    void run();
};

void Producer::run()
{
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
    for (int i = 0; i < DataSize; ++i) {
        freeBytes.acquire();
        buffer[i % BufferSize] = "ACGT"[(int)qrand() % 4];
        usedBytes.release();
    }
}
//! [2]

//! [3]
class Consumer : public QThread
//! [3] //! [4]
{
public:
    void run();
};

void Consumer::run()
{
    for (int i = 0; i < DataSize; ++i) {
        usedBytes.acquire();
        fprintf(stderr, "%c", buffer[i % BufferSize]);
        freeBytes.release();
    }
    fprintf(stderr, "\n");
}
//! [4]

//! [5]
int main(int argc, char *argv[])
//! [5] //! [6]
{
    QCoreApplication app(argc, argv);
    Producer producer;
    Consumer consumer;
    producer.start();
    consumer.start();
    producer.wait();
    consumer.wait();
    return 0;
}
//! [6]

Зачем тут у freeBytes в конструкторе BufferSize? по моему достаточно 1, мы же 1 ресурс захватываем и освобождаем. Я попробовал с 1 результат тот же. что и с BufferSize. Что по моему логично. Но зачем тогда freeBytes(BufferSize)?
« Последнее редактирование: Март 27, 2011, 23:34 от like-nix » Записан
like-nix
Гость
« Ответ #1 : Март 28, 2011, 00:37 »

Если я правильно понял это затем чтобы продюсер смог обогнать потребителя, и этот обгон был учтен. А если мы делаем 1 в конструкторе freeBytes, то в этом случае продюсер обязан обязательно ждать потребителя.
Записан
Fat-Zer
Гость
« Ответ #2 : Март 28, 2011, 00:59 »

не совсем... это классика.
один семофор блокирует потребителей, если буффер пуст, а другой производителей, если он полон.
Записан
like-nix
Гость
« Ответ #3 : Март 28, 2011, 01:09 »

Помое му я так и написал только производитель может опредить потребителя а потребитель производителя нет
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Март 28, 2011, 11:29 »

Зачем тут у freeBytes в конструкторе BufferSize? по моему достаточно 1, мы же 1 ресурс захватываем и освобождаем. Я попробовал с 1 результат тот же. что и с BufferSize. Что по моему логично. Но зачем тогда freeBytes(BufferSize)?
Да, 1 достаточна, но если у Producer'а есть "фронт работ", зачем он должен каждый раз ждать пока Consumer распечатает? Красивый примерчик.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.136 секунд. Запросов: 22.