【发布时间】:2019-09-19 22:49:54
【问题描述】:
今天我将实现一个非常基本的 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 或更高版本实现的代码回答我。
【问题讨论】:
-
无关:C++03 从未得到任何尊重。
-
不相关:保存一些动态分配并将
Clerk* clerks[] = { new Clerk(), new Clerk(), new Clerk(), new Clerk(), new Clerk()};替换为Clerk clerks[5];和Service* newService = new Service(clerks[i], newCustomer); delete newService;与Service newService(&clerks[i], newCustomer);记住C++ 不是一种野蛮的语言,你必须new一切。跨度> -
如果没有看到应该使事情并行运行的代码,很难弄清楚为什么代码会同步运行。您应该提供一个 minimal reproducible example 来证明该问题。特别是,您的自定义
Thread类是什么样的?正在调用的Join函数是什么? -
@JaMiT 当提问者几个小时前询问Thread class 时,我对这个确切的错误发表了评论。