当我在malloc pthread_t中保存新创建的线程ID并将其释放到另一个线程时,发生了故障地址。代码如下:
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
谢谢!
答案 0 :(得分:1)
pthread_create()
将创建的线程的线程ID(TID)存储在第一个参数指向的位置,但是在创建线程后执行此操作(http://opengroup.org/onlinepubs/007908799/xsh/pthread_create.html):
成功完成后,pthread_create()将创建的线程的ID存储在线程引用的位置
由于线程已经创建,因此在pthread_create()
有机会将TID存储在其中之前,很可能会运行并删除该内存块。
当你在结构中没有dummy_int
成员时,你可能会以早期崩溃的方式破坏堆。如果包含dummy_int
成员,则恰好会丢弃不太敏感的内容(因此崩溃的频率会低一些)。在任何一种情况下,你都在捣毁未分配的内存(或者可能没有分配 - 你有竞争条件)。