当我malloc pthread_t保存一个新创建的线程ID并将它释放到另一个线程时发生故障地址。代码如下:线程的malloc/free pthread_t时的故障地址
typedef struct _TaskInfo {
// int dummy_int;
pthread_t tid;
} TaskInfo;
void* dummy_task(void* pArg) {
free(pArg);
return NULL;
}
void create_task() {
TaskInfo *pInfo;
pthread_attr_t attr;
// set detached state stuff ...
pInfo = (TaskInfo*) malloc(sizeof(TaskInfo));
pthread_create(&pInfo->tid, &attr, dummy_task, pInfo);
// destroy pthread attribute stuff ...
}
int main() {
int i;
while(i < 10000) {
create_task();
++i;
}
return 0;
}
当我取消注释TaskInfo的成员dummy_int时,它有时会成功运行,但有时会失败。 我的平台是VMWare + Ubuntu 9.10 + ndk r3
谢谢!
非常感谢!但我仍然想知道为什么Linux上的相同代码工作正常。因为我从Robert Love的“Linux内核开发”中读到内核首先运行子进程,Linux上进程和线程的执行是相同的。 Linux上的线程调度与android不同吗? – scleung 2010-04-28 07:22:39
我不能说 - 但无论哪种情况,由于您正在处理竞争条件,您正在处理的代码在某些时候会失败。这可能是因为Android上的故障更加“确定”,因为您可能使用单个处理器设备,而在Linux上,您可能正在运行多处理器设备,因此原始线程有机会在TID之前保存TID 'free()'出现在新创建的线程中。或者Linux可能在调度程序中有足够的差异来让你摆脱困境。但它仍然是错误的 - 在某些情况下你只是没有注意到它。 – 2010-04-28 07:33:59