Как заставить этот код работать как асинхронная программа - PullRequest
0 голосов
/ 20 сентября 2019

Сегодня я бы реализовал очень простой класс Thread.Мой вопрос заключается в том, почему этот код выполняется синхронно:

struct Clerk : public Thread
{
    Clerk()
    {
        IsOnService = false;
    }
    void Run()
    {
        std::deque<int> dq;
        std::cout << this->GetId() << " receive new customer " << '\n';
        for (int i = 0; i < 1000000; ++i) dq.push_front(i);
        std::cout << this->GetId() << " has finished" << '\n';

        IsOnService = false;
    }

    bool IsOnService;
};

struct Customer
{
    bool IsOnService;
};

struct Service
{
    Clerk*      clerk;
    Customer*   customer;
    Service(Clerk* c, Customer* cu)
    {
        clerk = c;
        customer = cu;
        clerk->Join();
    }
};

int main()
{
    int nClerks = 5;
    Clerk* clerks[] = { 
        new Clerk(), new Clerk(), new Clerk(), new Clerk(), new Clerk()
    };

    while (1) {
        if (GetAsyncKeyState(0x43) & 0x7FFF) {
            Customer* newCustomer = new Customer();
            for (int i = 0; i < nClerks; ++i)
                if (!clerks[i]->IsOnService) {
                    Service* newService = new Service(clerks[i], newCustomer);
                    delete newService;
                    break;
                }
        }
    }
    for (int i = 0; i < nClerks; ++i) delete clerks[i];
    return 0;
}

Первый

Эта очередь предназначена только для выполнения тяжелой работы, которая занимает несколько раз, но когда я запускаю приведенный выше код, это требует времени, нозапускать поток для потока, я имею в виду, что у меня есть что-то вроде этого при запуске:

C:>100 receive new customer

... несколько раз ...

C:>100 has finished

C:>150 receive new customer

... несколько раз ...

C:>150 has finished

... и т. Д.

ИЯ хочу иметь следующее поведение:

C:>100 receive new customer

C:>150 receive new customer

C:>100 has finished

C:>150 has finished

Или что-то в этом роде.Если кто-то может мне помочь.Я использовал deque, потому что хочу выполнить задачу, которая требует времени, но код должен компилироваться в C ++ 98.Пожалуйста, не отвечайте мне кодом, который реализован на C ++ 11 или выше.

1 Ответ

0 голосов
/ 20 сентября 2019

Каждый раз, когда вы добавляете работу к Clerk с помощью

Service(Clerk* c, Customer* cu)
{
    clerk = c;
    customer = cu;
    clerk->Join();
}

Отмена функции Join из предыдущего вопроса Аскера

void Thread::Join()
{
    m_handle = (HANDLE)_beginthreadex(0, 0, &this->call, 0, 0, 0);
    if (m_handle) WaitForSingleObject(m_handle, INFINITE);
}

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

Вам нужно добавить задания в Clerk с и позволить Clerk с работать с одним и только одним потоком на Clerk.Когда больше нет рабочих мест, которые нужно добавить, вы присоединяетесь к Clerk s.Это требует довольно большой перезаписи класса Thread из предыдущего вопроса.

Здесь вы действительно хотите создать пул потоков из Clerk s.

Переосмыслить Service, кстати.Там нет необходимости в классе здесь.Так как Сервис создан, уничтожен сразу же после него и ему не нужно поддерживать какое-либо состояние, пока он жив, достаточно бесплатной функции .

...