android - 跨线程malloc/free pthread_t时的故障地址

标签 android android-ndk

当我 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/

相关文章:

java - 如何将参数传递给 android junit 测试(参数化测试)

Android Kotlin DSL - Unresolved reference : firebaseAppDistribution

android - Google Play 64位要求Gamemaker Studio

android - 从 AVFrame(android) 加载纹理的问题

android - 无法运行 React-Native UIExplorer 示例项目

python - kivy/buildozer 失败并显示 "Please report issue to enable support for newer NDK"

java - 如何在android中构建CLM

android - java.lang.IllegalStateException : Activity has been destroyed Exception 错误

java - 从 Android 设备访问 SQL DB 时,我的 httpEntity 返回 null,任何人都可以告诉我这是为什么吗?

android - 如何为 ImageView 设置可点击区域?