Как использовать Mutex C для защиты ресурсов в многопоточных программах
Мьютекс — это механизм синхронизации, используемый для управления доступом к ресурсам многопоточной программы. Он обеспечивает монопольный доступ к критической секции кода для предотвращения одновременного доступа нескольких потоков. Если поток владеет мьютексом, то другие потоки не могут получить доступ к защищаемому ресурсу до тех пор, пока мьютекс не будет освобожден первым потоком.
Пример создания и использования мьютекса на языке C:
c
#include
#include
#include
pthread_mutex_t mutex;
void *thread_func(void *arg) {
pthread_mutex_lock(&mutex);
printf("Thread %d: locked mutex\n", (int) arg);
// Критическая секция
printf("Thread %d: unlocked mutex\n", (int) arg);
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t threads[5];
pthread_mutex_init(&mutex, NULL);
for (int i = 0; i < 5; i++) {
pthread_create(&threads[i], NULL, thread_func, (void *) i);
}
for (int i = 0; i < 5; i++) {
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&mutex);
return 0;
}
В этом примере создаются пять потоков, которые конкурентно работают с мьютексом. Функция `thread_func` блокирует мьютекс, заходит в критическую секцию, выполняет работу и освобождает мьютекс.
Функция `pthread_mutex_lock` блокирует мьютекс и ожидает, пока другой поток не освободит его. Если поток уже владеет мьютексом, то он продолжает свою работу без блокировки.
Функция `pthread_mutex_unlock` освобождает мьютекс и позволяет другим потокам получить доступ к защищаемому ресурсу.
Функция `pthread_mutex_init` инициализирует мьютекс перед использованием, а функция `pthread_mutex_destroy` уничтожает его после окончания работы программы.
В результате выполнения программы вывод на консоль будет примерно таким:
Thread 0: locked mutex
Thread 2: locked mutex
Thread 3: locked mutex
Thread 1: locked mutex
Thread 4: locked mutex
Thread 0: unlocked mutex
Thread 2: unlocked mutex
Thread 1: unlocked mutex
Thread 4: unlocked mutex
Thread 3: unlocked mutex
Как видно из вывода, мьютекс блокируется и освобождается в правильном порядке, не допуская одновременного доступа нескольких потоков к критической секции кода.