Обычно правильная последовательность выглядит примерно так:
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()
?