У меня есть 4 обработанных имени A, B, C, D в 4 потоках, Они печатают их имя. Я хочу использовать mutex для обработки A, B, C, D в порядке A, B, C, D. Это мой код, но он не работает, как мне кажется. Как они работают?Как использовать мьютекс в C для многопоточности?
#include <stdio.h>
#include <pthread.h>
void processA();
void processB();
void processC();
void processD();
pthread_mutex_t mutex;
void main(){
pthread_t thread1;
pthread_t thread2;
pthread_t thread3;
pthread_t thread4;
pthread_mutex_init(&mutex,NULL);
pthread_create(&thread1, NULL, (void *)&processA,NULL);
pthread_create(&thread2, NULL, (void *)&processB,NULL);
pthread_create(&thread3, NULL, (void *)&processC,NULL);
pthread_create(&thread4, NULL, (void *)&processD,NULL);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
pthread_join(thread3, NULL);
pthread_join(thread4, NULL);
pthread_mutex_destroy(&mutex);
}
void processA()
{
while (1)
{
pthread_mutex_lock(&mutex);
printf("A \n");
pthread_mutex_unlock(&mutex);
}
}
void processB()
{
while (1)
{
pthread_mutex_lock(&mutex);
printf("B \n");
pthread_mutex_unlock(&mutex);
}
}
void processC()
{
while (1)
{
pthread_mutex_lock(&mutex);
printf("C \n");
pthread_mutex_unlock(&mutex);
}
}
void processD()
{
pthread_mutex_lock(&mutex);
while (1)
{
pthread_mutex_lock(&mutex);
printf("D \n");
pthread_mutex_unlock(&mutex);
}
}
У вас нет контроля над тем, какие из потоков будут работать в первую очередь. Вам нужно выяснить другой способ синхронизации потоков. Может быть, переменные условий? Или несколько мьютексов, если это необходимо для их использования? –
Если вы хотите, чтобы ваши процессы запускались «в порядке», вам не нужны потоки или мьютексы. Мьютекс используется для предотвращения записи нескольких потоков в одно и то же место, ничего другого. – DeiDei
О несвязанной ноте: объявление 'void processA();' не объявляет функцию 'processA', которая не принимает аргументов. Он объявляет функцию, которая принимает неопределенное количество неизвестных аргументов. Если вы хотите явно указать, что функция не принимает никаких аргументов, вам нужно использовать 'void processA (void);' –