Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: like-nix от Март 27, 2011, 23:32



Название: Объясните пример по QSemaphore
Отправлено: 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)?


Название: Re: Объясните пример по QSemaphore
Отправлено: like-nix от Март 28, 2011, 00:37
Если я правильно понял это затем чтобы продюсер смог обогнать потребителя, и этот обгон был учтен. А если мы делаем 1 в конструкторе freeBytes, то в этом случае продюсер обязан обязательно ждать потребителя.


Название: Re: Объясните пример по QSemaphore
Отправлено: Fat-Zer от Март 28, 2011, 00:59
не совсем... это классика.
один семофор блокирует потребителей, если буффер пуст, а другой производителей, если он полон.


Название: Re: Объясните пример по QSemaphore
Отправлено: like-nix от Март 28, 2011, 01:09
Помое му я так и написал только производитель может опредить потребителя а потребитель производителя нет


Название: Re: Объясните пример по QSemaphore
Отправлено: Igors от Март 28, 2011, 11:29
Зачем тут у freeBytes в конструкторе BufferSize? по моему достаточно 1, мы же 1 ресурс захватываем и освобождаем. Я попробовал с 1 результат тот же. что и с BufferSize. Что по моему логично. Но зачем тогда freeBytes(BufferSize)?
Да, 1 достаточна, но если у Producer'а есть "фронт работ", зачем он должен каждый раз ждать пока Consumer распечатает? Красивый примерчик.