gpt4 book ai didi

c++ - 指向 Thread 的指针数组中的 PCB 中的相同名称

转载 作者:行者123 更新时间:2023-11-28 00:50:06 26 4
gpt4 key购买 nike

我正在用 C++ 编写线程处理代码。 Thread 的一个实例有一个指向 PCB 结构的指针,在 Thread 的构造函数中我只是调用 myPCB = new PCB(name, stackSize, timeSlice, this)。一切正常,直到我尝试创建一个指向线程的指针数组。

当我只是创建一个指向线程的指针并使用 new Thread(name, stackSize, timeSlice) 对其进行初始化时,该线程在 PCB 中的名称被正确指定。

但是当我尝试使用指针数组时,所有 PCB 的名称变量都具有相同的值。

我已经检查过,它们都是不同的 PCB(它们的 ID 不同)。它们的名称在构造函数中得到正确初始化,但在第 N 个构造函数末尾和第 (N+1) 个构造函数末尾之间的某个位置,所有名称都获得相同的值,即 N+1 的值。

PCB构造函数:

PCB::PCB(TName namee, StackSize stackSizee, Time timeSlicee,Thread *threadd){
status = begging;

id = genID++;
if(namee) name = namee;
else name = "Thread"+id;

createStack(stackSizee);

thread = threadd;

timeSlice = timeSlicee;

System::numberOfThreads++;
System::allPCBQueue.add(this);

waitingMe = new Queue();
waitingFor = 0;

semaphore = 0;

sleepTime = -1;
}

void PCB::createStack(StackSize stackSize){
intOff;
if(stackSize > maxStack) stack = new char[maxStack];
else stack = new char[stackSize];

newSS = FP_SEG(stack + stackSize);
newSP = FP_OFF(stack + stackSize);
asm{
mov oldSS, ss
mov oldSP, sp
mov ss, newSS
mov sp, newSP

push ax; push bx; push cx; push dx; push es; push ds; push si; push di; push bp

mov newSP, sp
mov newSS, ss
mov sp, oldSP
mov ss, oldSS
}

stackPointer = MK_FP(newSS, newSP);
intOn;
}

我认为它与 createStack() 有关,但我不知道是什么。感谢所有帮助。

*注意:我目前不能经常上网所以如果我没有快速回复请不要生气。我会尽可能多地检查这个问题。

编辑:PCB类定义:

class PCB
{
static ID genID;

char *stack;
void *stackPointer;
Thread *thread;

TName name;
ID id;

Time timeSlice, sleepTime;
Status status;

Queue *waitingMe;
PCB* waitingFor;

KernelSem* semaphore;

friend class Thread;

// static unsigned newSS, newSP, oldSS, oldSP;

public:
static StackSize maxStack;

PCB(TName name, StackSize stackSize, Time timeSlice,Thread *thread);
~PCB(void);

void runThread();

ID getID(){
return id;
}
TName getName(){
return name;
}

void setStatus(Status status){
this->status = status;
}
Status getStatus(){
return status;
}
int getEnding(){
if(status == ending) return 1;
return 0;
}
int getBegging(){
if(status == begging) return 1;
return 0;
}

void createStack(StackSize stackSize);
void* getStackPointer(){
return stackPointer;
}
void setStack(void *newStackPointer){
stackPointer = newStackPointer;
}

Time getTimeSlice(){return timeSlice;}

Time getSleepTime(){return sleepTime;}
void decrementSleepTime(){sleepTime--;}

void setSemaphore(KernelSem* kersem){this->semaphore = kersem;}
void resetSemphore(){this->semaphore = 0;}

Thread* getThread(){return thread;}
};

发生这种情况的代码:

Producer **pro = new Producer*[N];

for (i=0; i<N; i++){
producerName[8]='0'+i;
pro[i] = new Producer(buff, producerName ,'0'+i, TIME_SLICE);
pro[i]->start();
}

这是我通过此作业获得的测试文件的一部分。它不能被改变。但这是有规律的。我放了

allPCBQueue->listAll()

之后

pro[i] = new Producer(buff, producerName ,'0'+i, TIME_SLICE);

而且我总是知道所有的名字都是一样的。 allPCBQueue 是一个简单的 PCB 列表

最佳答案

if(namee) name = namee;
else name = "Thread"+id; <<< Doesn't do what you think it does.

“Thread”是一个char *,给它加上一个数字就会得到指针+偏移量。

在创建新堆栈之前,您不想切换到它。不要使用推送来存储,只需使用这样的东西:

stackPointer = MK_FP(newSS, newSP);

unsigned *sp = reinterpret_cast<unsigned *>(stackPointer);

*--sp = 0; // AX
*--sp = 0; // BX
*--sp = 0; // CX
*--sp = 0; // DX
*--sp = default_ds; // You'll have to dig this out with some inline assembler
*--sp = default_es; // You'll have to dig this out with some inline assembler
*--sp = 0; // SI
*--sp = 0; // DI
*--sp = 0; // BP

stackPointer = reinterpret_cast<void *>(sp);

[当然,首先让 stackpointer 成为指向 int 的指针会更容易]。

由于线程是从头开始的,因此 AX、BX 等的值无关紧要。 ES/DS 可能很重要,具体取决于您使用的内存模型。不压栈也意味着你不必为这部分禁用中断——总是一个好处。

不幸的是,您的代码没有显示您正在使用“PCB 阵列”做什么,所以我不能说那里有什么问题。而且我敢肯定有人说这应该是评论,而不是答案,因为它实际上并没有回答你的问题 - 但评论中的格式化代码几乎没有希望......

编辑:

我猜“producername”是您代码中创建线程的局部变量。这行不通,但我认为要求调用者必须确保名称永远保留有点困难,所以我认为你应该做的是:

if(namee)
{
size_t len = strlen(namee);
char *name_buf = new char[len+1];
strcpy(name_buf, namee);
name = name_buf;
}
else
{
// Make up some random name here.
}

关于c++ - 指向 Thread 的指针数组中的 PCB 中的相同名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14604691/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com