作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我 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
谢谢!
最佳答案
pthread_create()
将已创建线程的线程 ID (TID) 存储在第一个参数指向的位置,但它是在线程创建后执行的 (http://opengroup.org/onlinepubs/007908799/xsh/pthread_create.html):
Upon successful completion, pthread_create() stores the ID of the created thread in the location referenced by thread
由于线程已经创建,它很可能有机会在 pthread_create()
有机会在其中存储 TID 之前运行并删除该内存块。
当结构中没有 dummy_int
成员时,您可能会以一种提前崩溃的方式破坏堆。包含 dummy_int
成员后,您碰巧丢弃了一些不太敏感的东西(因此崩溃的频率较低)。在任何一种情况下,您都在破坏未分配的内存(或者可能未分配 - 您有竞争条件)。
关于android - 跨线程malloc/free pthread_t时的故障地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2727341/
我是一名优秀的程序员,十分优秀!