2016-10-23 3 views
1

Я новичок в pthreads и с трудом создаю поток со структурой и сохраняю его данные без изменений, перебрасывая его из указателя void.C++ pthreads и данные по разложению структуры

Я провел несколько дней, пытаясь найти причину этого и не имел большой удачи. Из двух моих структур (с использованием двух разных потоков) один из них корректно вписывается в поток, но по какой-то причине второй не делает этого.

:

Структура
struct Arguments { 
    List linkedList; 
    Node node; 
    Arguments(){} 
    Arguments (List *newList, Node *newNode){ 
     linkedList = *newList; 
     pcb = *newPCB; 
    } 
}; 

struct ClockControl { 
    int counter = 0; 
    pthread_mutex_t lock; 
}; 

Тема:

void *schedule(void *args){ 

    //Arguments *newArgs = static_cast<Arguments*>(args); <-- Tried this, doesn't work either. 
    arguments *newArgs = (arguments *) args; 
    List tempList = (newArgs ->linkedList); //DATA HERE IS CORRUPTED/WRONG 
    Node tempNode = (newArgs ->node); //DATA HERE IS CORRUPTED/WRONG 

    cout << "Flagged" << Lendl; 

    return NULL; 
} 

void *clockTime(void *clock){ 
    //This thread works fine 

    clockControl *newClock = (clockControl*) clock; 
    int localVariable = 0; 

    localVariable = (newClock -> counter); 

    pthread_mutex_lock(&(newClock -> lock)); 
    localVariable++; 
    newClock->counter = localVariable; 
    pthread_mutex_unlock(&(newClock -> lock)); 

    return NULL; 
} 

Главные:

int main(int argc, char** argv) 
{ 
    pthread_t threads[NUM_THREADS]; //Defined as 5 

    clockControl clock; 
    clock.counter = 0; 
    pthread_mutex_init(&clock.lock, NULL); 

    //Lists are initialized with variables.  
    List pendingList = initializeList(); 
    List readyList = initializeList(); 


    Arguments *args = new Arguments(&readyList, &pendingList.head->info); 

    while (clock.counter < 6000){ 
     pthread_create(&threads[1], NULL, clockTime, (void*) &clock); 

     if (clock.counter == pendingList.head->info.timeCreated){ 

      pthread_create(&threads[0], NULL, schedule, (void*) &args); 
          //INSPECTING args HERE HAS ACCURATE DATA 

    } 

     //Clean up threads 
     for (int i = 0; i < 2; i++){ 
      pthread_join(threads[i],NULL); 
     } 
    } 
} 

Как я уже сказал, я искал вокруг и в значительной степени спиннинг моих колес в этой точке. У меня есть подозрение, что может быть, что память освобождается или очищается до того, как поток будет выполнен, но я не могу найти способ обойти его.

Любая помощь будет оценена по достоинству.

+0

Мне кажется, что цикл будет вращаться кругами, создавая потоки. Кроме того, поток часов обновляет clock.counter, который читает основной поток выполнения, без какой-либо последовательности. Это очевидное неопределенное поведение и ошибка. С показанным кодом слишком много проблем. Я предлагаю вам начать с более простого многопоточного excersize, чем это. –

+0

Это действительно больше похоже на C, чем на C++, за исключением ключевого слова 'new' ... – Charles

+0

@ c650 Да, реквестер специально попросил pthreads вместо std :: threads C++, и я унаследовал код связанного списка/узла , Как только я получаю потоки, все остальное обновляется. – miliardo18

ответ

2

Вы передаете адрес указателя на аргументы функции расписания. Обсуждение: &args, args уже есть Arguments*, так что вы проходите Arguments**. Чтобы решить эту проблему, вы можете просто передать args самой функции.

Также, как вы знаете, reinterpret_cast<Arguments*>, вероятно, более подходит, чем static_cast при этом обстоятельстве.

0

Эти две строки кода должны быть заменены

localVariable = (newClock -> counter); 

pthread_mutex_lock(&(newClock -> lock)); z 

т.е.

pthread_mutex_lock(&(newClock -> lock)); 
localVariable = (newClock -> counter); 

Так что localVariable будет правильное значение, когда более, что одна нить читает counter и обновляет его

+0

Спасибо! Я обновил его. – miliardo18

Смежные вопросы