Adresa chyba, když malloc / volný pthread_t přes závity

hlasů
2

Adresa chyba nastala, když jsem malloc pthread_t uložit nově vytvořené vlákno id a zdarma je v jiném vlákně. Kódů takto:

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;
}

Když jsem vložte člen dummy_int z TaskInfo někdy proběhl úspěšně, ale někdy se nezdařilo. Můj platforma je VMWare + Ubuntu 9.10 + NDK r3

Dík!

Položena 28/04/2010 v 07:49
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

pthread_create()ukládá nit ID (TID) vytvořeného závitu v místě, na který ukazuje první parametr, ale to dělá, že poté, co je vytvořen závit ( http://opengroup.org/onlinepubs/007908799/xsh/pthread_create.html ):

Po úspěšném absolvování pthread_create () ukládá ID vytvořeného závitu v místě odkazuje nití

Vzhledem k tomu již byl vytvořen závit, může se snadno dostat šanci na spuštění a odstranit, že blok paměti, než pthread_create()dostane šanci k uložení TID v něm.

Když nemáte na dummy_intprvek v struct jste pravděpodobně poškozením haldy takovým způsobem, který narazí brzy. S dummy_intčlen součástí, se stalo, že trashing něco méně citlivé (takže pády jsou o něco méně časté). V obou případech budete starého železa paměť, která není přidělena (nebo nemusí být přidělena - máte spor).

Odpovězeno 28/04/2010 v 08:08
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more