Я новичок в 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);
}
}
}
Как я уже сказал, я искал вокруг и в значительной степени спиннинг моих колес в этой точке. У меня есть подозрение, что может быть, что память освобождается или очищается до того, как поток будет выполнен, но я не могу найти способ обойти его.
Любая помощь будет оценена по достоинству.
Мне кажется, что цикл будет вращаться кругами, создавая потоки. Кроме того, поток часов обновляет clock.counter, который читает основной поток выполнения, без какой-либо последовательности. Это очевидное неопределенное поведение и ошибка. С показанным кодом слишком много проблем. Я предлагаю вам начать с более простого многопоточного excersize, чем это. –
Это действительно больше похоже на C, чем на C++, за исключением ключевого слова 'new' ... – Charles
@ c650 Да, реквестер специально попросил pthreads вместо std :: threads C++, и я унаследовал код связанного списка/узла , Как только я получаю потоки, все остальное обновляется. – miliardo18