2

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

谢谢!

4

1 回答 1

1

pthread_create()将创建的线程的线程 ID (TID) 存储在第一个参数指向的位置,但是它会在创建线程之后执行此操作 ( http://opengroup.org/onlinepubs/007908799/xsh/pthread_create.html ):

成功完成后,pthread_create() 将创建的线程的 ID 存储在线程引用的位置

由于线程已经创建,它很可能有机会运行并删除该内存块,然后pthread_create()才有机会将 TID 存储在其中。

当结构中没有dummy_int成员时,您可能会以一种过早崩溃的方式破坏堆。包含该dummy_int成员后,您碰巧丢弃了一些不那么敏感的东西(因此崩溃的频率降低了一些)。在任何一种情况下,您都在丢弃未分配的内存(或可能未分配 - 您有竞争条件)。

于 2010-04-28T07:08:55.327 回答