【发布时间】:2016-05-26 03:34:34
【问题描述】:
我在 C++ 中使用结构,我尝试在该结构中保存指针,但是当我尝试在线程中使用该结构时,我无法获取该结构的数据。
struct threadData {
void* memPointer;
void* instructionPointer;
void* stackPointer;
int memsize;
};
void *worker_thread(void *arg) {
struct threadData *my_data;
my_data = (struct threadData *) arg;
cout<<"INSTRUCTION POINTER: "<<my_data->instructionPointer<<endl;
cout<<"MEMORY POINTER: "<<my_data->memPointer<<endl;
cout<<"STACK POINTER: "<<my_data->stackPointer<<endl;
cout<<"MEMORY SIZE: "<<my_data->memsize<<endl;
}
int main() {
pthread_t my_thread;
int ret;
struct threadData td = { calloc(1, 32), calloc(1000000, 64), calloc(34, 4),6475 };
ret = pthread_create(&my_thread, NULL, worker_thread, (void *) &td);
pthread_detach(my_thread);
//pthread_exit(NULL);
}
但是当我在 pthread_detach 之后使用 pthread_exit(NULL) 时,我可以使用方法“worker_thread”中的结构信息。
【问题讨论】:
-
如果您使用 C++,为什么不使用构造函数来初始化您的结构?您还使用了 C 风格的强制转换,并使用
struct关键字来引用您的结构类型(这在 C++ 中几乎从不需要)。这是非常类似于 C 的 C++ 代码... -
C++11 实现你正在尝试做的事情:coliru.stacked-crooked.com/a/f0b3dadb23bd7bba
-
@kfsone 您可能还需要将 calloc 调用替换为
new char[x*y]以使其完全类似于 C++。为了完整起见,我将释放/删除分配的数据。当然,这里没有必要,但因此提前考虑从一开始就销毁任何分配的内存可能会阻止您在将来的某个时间创建内存泄漏...... -
除了 Aconcagua 的建议之外,我将移动 inside 字段的
new调用,构造函数只会将大小作为参数。void*类型也让我感到厌烦......在精心设计的 C++ 代码中,几乎总是有更好的替代void*的方法。
标签: c++ multithreading pointers structure