У меня большая проблема, я не могу понять, почему мьютексы в C не работают, как я ожидаю. Это мой код:POSIX C Threads. Пример Mutex. Не работает должным образом
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
pthread_t mythread;
pthread_mutex_t mymutex;
void *anotherFunc(void*)
{
pthread_mutex_lock(&mymutex);
for(int i = 0; i < 100; i++)
printf("anotherFunc\n");
pthread_mutex_unlock(&mymutex);
pthread_exit(NULL);
}
void *func(void*)
{
pthread_mutex_lock(&mymutex);
for(int i = 0; i < 100; i++)
printf("func\n");
pthread_mutex_unlock(&mymutex);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_mutex_init(&mymutex, NULL);
pthread_create(&mythread, NULL, func, NULL);
pthread_create(&mythread, NULL, anotherFunc, NULL);
pthread_mutex_destroy(&mymutex);
pthread_exit(NULL);
return EXIT_SUCCESS;
}
Что я ожидаю, так это программа для печати первых 100 «Func» сообщения, а затем 100 сообщений «anotherFunc». Я ожидаю, что это выполнение для достижения func и блокировки мьютекса. Когда выполнение достигнет anotherFunc, я ожидаю, пока func не разблокирует мьютекс. Но я получаю вмешивались сообщения как
FUNC Func функ anotherFunc anotherFunc anotherFunc функ anotherFunc
Я не понимаю, как эта штука работает. Пожалуйста помоги!
Я думаю, что это работает :) Это мой окончательный код для тех, кто заинтересован ... http://pastebin.me/bc23773578d79a55882d7ced4e04b026 –
По-прежнему сломан. Вы только убедитесь, что * one * thread закончен, когда вы уничтожаете мьютекс. Что делать, если еще не сделано? Нет никакой гарантии, что нить начнется, приобретет мьютекс или закончится в каком-либо конкретном порядке, если вы каким-либо образом не заставите ее. (Урок один из многопоточности таков: вещи гарантированы только в определенном порядке, если вы заставите их произойти в этом порядке.) –
Да, но у меня есть обе функции, запущенные в одном потоке, единственный поток: mythread. Можно ли это сделать или всегда безопаснее использовать один поток для одной функции? –