2016-12-19 2 views
1

У меня есть 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); 
    } 
} 
+0

У вас нет контроля над тем, какие из потоков будут работать в первую очередь. Вам нужно выяснить другой способ синхронизации потоков. Может быть, переменные условий? Или несколько мьютексов, если это необходимо для их использования? –

+2

Если вы хотите, чтобы ваши процессы запускались «в порядке», вам не нужны потоки или мьютексы. Мьютекс используется для предотвращения записи нескольких потоков в одно и то же место, ничего другого. – DeiDei

+1

О несвязанной ноте: объявление 'void processA();' не объявляет функцию 'processA', которая не принимает аргументов. Он объявляет функцию, которая принимает неопределенное количество неизвестных аргументов. Если вы хотите явно указать, что функция не принимает никаких аргументов, вам нужно использовать 'void processA (void);' –

ответ

1

mutex для создания взаимного исключения в том или ином контексте. Например, если у вас есть объект, который должен быть достигнут одним потоком за раз, вы можете использовать mutex.

Для реализации такой функции вы должны использовать 3 semaphores. Вы можете сказать:

//semaphore1 = up, semaphore2 = up, semaphore3 = up 
//Thread A 
    //wait for semaphore1 is up 
     //work 
     //make semaphore1 down 
//Thread B 
    //wait for semaphore1 is down 
     //work 
     //make semaphore2 down  
//Thread C 
    //wait for semaphore2 is down 
     //work 
     //make semaphore3 down  
//Thread D 
    //wait for semaphore3 is down 
     //work 
+0

Это не является хорошим ответом в контексте, который положил OP. Семафоры - это только дополнительная функция в POSIX и в опции потока C, которой они вообще не присутствуют. Вместо этого используйте переменную условия. (Также семафоры POSIX довольно сложно обрабатывать правильно, потому что их функции прерываются.) –

+0

Как вы ожидаете своего состояния? разве это не сложно, чем объяснять концепцию. – cokceken

+0

Что вы подразумеваете под «как подождать?» Использование 'pthread_cond_wait' соответственно' cnd_wait', очевидно. –

Смежные вопросы