Переменные-члены указателя меняются по какой-то причине? - PullRequest
0 голосов
/ 04 апреля 2019

Я выполняю поток для планировщика и вставляю процессы в очередь планировщика в основном потоке, пока поток планировщика все еще выполняется.По какой-то причине переменные объекта процесса изменяются, когда сам объект передается в ReadyQueue.Например, я передаю 100 msBurstTime, и когда я печатаю его в потоке, он говорит, что это 32571. Вот код планировщика для выполнения потока:

void Scheduler::startThread(CPU *cpu, IO_manager *io_m){
    this->link(cpu, io_m);
    pthread_t thread;
    pthread_create(&thread, NULL, Scheduler::staticThreadEntry, this);
}

void Scheduler::FCFS(){
    while (true){
        sleep(2);
        if (this->ReadyQueue.size() > 0 && cpu->getRunningProcess() == NULL){
            std::cout << this->ReadyQueue.at(0) << ' ';
            // burst time out of whack here (32571 ms)
            std::cout << this->ReadyQueue.at(0)->getBurstTime() << std::endl;
            //std::cout << "Dispatched process" << std::endl;
            //this->dispatchProcess();
        }
        //std::cout << "CPU occupied" << std::endl;
    }
}

void* Scheduler::staticThreadEntry(void *self){
    ((Scheduler*) self)->FCFS();
}

И вот где я вставляю процесс вReadyQueue планировщика:

void Scheduler::insertProcess(Process *p){
    // burst time fine here (100 ms)
    this->ReadyQueue.push_back(p);
}

Вот что вызывается в main.cpp для инициализации планировщика:

scheduler.startThread(&cpu, &io_m);

и вот что вызывается в main.cpp для вставкипроцесс в ReadyQueue планировщика:

if (strcmp(args[0], "newp") == 0){
    // args[1] is process status, args[2] is ms burst time
    Process p(stoi(args[1]), stoi(args[2]));
    scheduler.insertProcess(&p);
}

Почему это происходит?Я проверяю ссылки на объект процесса, и это тот же экземпляр, так почему переменные-члены меняются?

1 Ответ

0 голосов
/ 04 апреля 2019
if (strcmp(args[0], "newp") == 0){
    // args[1] is process status, args[2] is ms burst time
    Process p(stoi(args[1]), stoi(args[2]));
    scheduler.insertProcess(&p);
}

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

Практически никогда не имеет смысла использовать коллекцию необработанных указателей.Это делает неясным, кому принадлежит объект и как управляется срок его службы.Используйте значения, если это возможно.В противном случае подумайте о std::unique_ptr или, если необходимо, std::shared_ptr.

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