Последовательность вызова pthread_init pthread_lock, pthread_destroy и так далее? - PullRequest
2 голосов
/ 08 февраля 2012

Обычно правильная последовательность выглядит примерно так:

pthread_mutex_init(&mutex,NULL);

pthread_mutex_lock(&mutex);

pthread_mutex_unlock(&mutex);

pthread_mutex_destroy(&mutex);

mutex должен быть инициализирован первым, а затем pthread_mutex_lock и pthread_mutex_unlock могут быть вызваны в соответствующем потоке для защиты критической секции, наконец, pthread_mutex_destroy вызывается для уничтожения mutex после завершения всех потоков , Но если порядок будет смешанным, что произойдет?

Я нарушаю последовательность функций, чтобы обнаружить ошибку, но все кажется нормальным, когда последовательность по-другому запутана. Вот пример.

pthread_mutex_t mutex;
static int count = 0;

void* func(void* arg)
{
    pthread_mutex_lock(&mutex);
    *(int*)arg = *(int*)(arg) + 1;
    printf("thread %d\n", *(int*)arg);
    pthread_mutex_unlock(&mutex);
}

int main(int argc, char* argv[])
{
    int i;
    pthread_mutex_init(&mutex, NULL);

    pthread_mutex_destroy(&mutex);

    for(i = 0; i < 3; i++)
    {
        pthread_t tid;
        pthread_create(&tid, NULL, func, (void*)(&count));
        sleep(5);
    }

    printf("the main thread exit normally.\n");
}

Я хочу спросить, имеет ли значение последовательность для программы. Есть ли внутри функции что-то для обеспечения последовательности вызова или что-то еще? Если эти функции можно использовать без порядка, почему должны быть определены pthread_mutex_init() и pthread_mutex_destroy()?

1 Ответ

4 голосов
/ 08 февраля 2012

То, что происходит, является неопределенным поведением. Реализация может или не может распечатать ошибку, прервать программу или запустить WW III. Или может показаться, что он работает нормально, но нет никаких гарантий.

...