C++ pthreads 和结构的损坏数据
c++ pthreads and struct's corrupting data
我是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
将是正确的值
相关文章:
- 为什么C中的通用链表中存储的数据已损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 类数组正在损坏数据
- 带有zip_source_buffer的libzip会导致数据损坏和/或segfault
- 发送特定字节模式时串行端口数据损坏
- 放置在外部 DLL 中的类中的字符串数据的内存损坏
- Winapi ReadFile返回损坏的数据
- 向量元素数据损坏了Find()操作
- Boost 的数据驱动测试的联接运算符"+"损坏了第一列
- 为什么链表中的数据在嵌套函数中会更改/损坏?
- 写入文本文件的数据部分损坏且无法恢复
- recv() 获取损坏的数据
- 数据结构中的双重释放或损坏
- 通过fstream读取文件时,存储在变量中的损坏数据..为什么?
- 如何在不损坏数据的情况下将缓冲区强制转换为结构
- ZeroMQ消息损坏数据
- 加载前请检查文件创建者,以防止篡改/损坏数据
- C++ pthreads 和结构的损坏数据
- 增强序列化-在反序列化损坏数据时不再出现archive_exception
- c++ UDP套接字在一定频率上损坏数据包