如何使此代码作为异步程序工作

How to make this code works as asynchronous program

今天我将实现一个非常基本的线程 class。我的问题是为什么这段代码 运行 同步:

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 或更高版本实现的代码回答我。

每次您将工作添加到 Clerk with

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 有一个且只有一个线程。当没有更多工作要添加时,您就加入 Clerks。这需要对上一个问题中的 Thread class 进行相当大的重写。

你真正想要的是让自己成为 Clerk 中的 thread pool

重新思考 Service,顺便说一下。这里不需要 class。由于 Service 创建后立即销毁,并且在其存在时实际上不需要维护任何状态,因此 free function 就足够了。