2

新しく作成されたスレッド ID を保存し、別のスレッドで解放するために pthread_t を malloc すると、障害アドレスが発生しました。コードは次のとおりです。

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 に答える