Адрес ошибки, когда malloc / free pthread_t в потоках - PullRequest
2 голосов
/ 28 апреля 2010

Адрес ошибки произошел, когда я malloc pthread_t, чтобы сохранить вновь созданный идентификатор потока и освободить его в другом потоке. Коды следующие:

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

Когда я раскомментирую член dummy_int в TaskInfo, он иногда запускается успешно, но иногда не удается. Моя платформа - VMWare + Ubuntu 9.10 + ndk r3

Спасибо!

1 Ответ

1 голос
/ 28 апреля 2010

pthread_create() сохраняет идентификатор потока (TID) созданного потока в месте, указанном первым параметром, однако это происходит после создания потока (http://opengroup.org/onlinepubs/007908799/xsh/pthread_create.html):

После успешного завершения pthread_create () сохраняет идентификатор созданного потока в месте, указанном потоком

Поскольку поток уже создан, он вполне может получить возможность запустить и удалить этот блок памяти до того, как pthread_create() получит возможность сохранить в нем TID.

Если в структуре нет члена dummy_int, вы, вероятно, повреждаете кучу таким образом, что происходит сбой на ранней стадии. С включенным участником dummy_int вы попадаете на что-то менее чувствительное (поэтому сбои происходят реже). В любом случае вы уничтожаете память, которая не выделена (или может быть не выделена - у вас есть состояние гонки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...