C++ pthreads 和结构的损坏数据

c++ pthreads and struct's corrupting data

本文关键字:损坏 数据 结构 pthreads C++      更新时间:2023-10-16

我是pthreads的新手,很难创建一个具有结构体的线程,并保持它的数据完整,同时从void指针重新转换它。

我花了几天时间四处寻找,试图找到一个原因,但没有多少运气。在我的两个结构(使用两个不同的线程)中,一个在线程中正确地重新强制转换,但出于某种原因,第二个没有。

结构:

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);
        }
    }
}

就像我说的,我已经到处找了,在这一点上我几乎是在旋转我的轮子。我怀疑这可能是在线程执行之前释放或清理内存,但我找不到解决方法。

您正在将指向args的指针的地址传递给调度函数。当你使用&args时,args已经是Arguments*了,所以你通过了Arguments**。要解决这个问题,您可以简单地将args本身传递给函数。

你也知道,在这种情况下,reinterpret_cast<Arguments*>可能比static_cast更合适。

这两行代码应该互换

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

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

这样,当多个线程正在读取counter并更新它时,localVariable将是正确的值