Как мне разработать программу для чтения из нескольких потоков данных? - PullRequest
0 голосов
/ 23 января 2011

Я пишу программу, которая использует два разных потока данных для выполнения определенных вычислений.В настоящее время мой код настроен так:

//pseudo c++

class Calculator
{
    //Stream is a class which contains a queue which has new messages added to it
    Stream a, b;

    bool BothQueuesHaveItems() { return !a.IsEmpty() && !b.IsEmpty(); }
    void PerformCalc() { /*Do domething with the first items in a and b*/ }

};


unsigned ThreadFunction(void *stop_event)
{
    Calculator calculator;

    while(WaitForSingleObject(stop_event) == WAIT_OBJECT_0)
    {
        if(calculator.BothQueuesHaveItems())
        {
            calculator.PerformCalc();
        }
        Sleep(5);
    }
}

int main()
{
    Event stop_event = CreateEvent(...);
    CreateThread(ThreadFunction, &stop_event, ...);

    //wait for user enter command to stop processing
    SetEvent(stop_event);
}

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

Ответы [ 2 ]

0 голосов
/ 05 февраля 2011

Я бы либо использовал перекрывающиеся (асинхронные) чтения Win32, либо создавал бы поток для каждого потока, чтобы выполнять синхронные блокирующие чтения.

0 голосов
/ 23 января 2011

Не используйте IsEmpty, вместо этого просто читайте символ из потока.Чтение будет блокироваться, пока символ не будет готов (по крайней мере, в * nix, не уверен в Windows).

Так что что-то вроде

pair <char,char> nextItems() { return make_pair(a.readChar(), b.readChar()); }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...