Программа с несколькими потоками всегда дает один и тот же вывод - PullRequest
0 голосов
/ 29 апреля 2020

Я изучаю многопоточность и пытаюсь создать программу, которая может печатать две строки попеременно. Я написал следующий код:

#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
pthread_mutex_t lock;
void print(char a[50]){
    pthread_mutex_lock(&lock);
    printf("%s", a);    //output console is the shared resource
    sleep(2);
    pthread_mutex_unlock(&lock);
}
void* hello(void* status){
    while(*((char*)status) != '\n'){ 
        print("Hello World\n"); 
    }
}
void* bye(void* status){
    while(*((char*)status) != '\n'){
        print("Goodbye World\n");
    }
}
int main(){
    pthread_t id1, id2;
    char status = '\0';
    int state;
    if (pthread_mutex_init(&lock, NULL) != 0) { 
        printf("\n mutex init has failed\n"); 
        exit(1); 
    }
    printf("Starting Threads (Press Enter to terminate)\n");
    state = pthread_create(&id1, NULL, hello, &status);
    if(state != 0){
        printf("Could not create thread, exiting.\n");
        exit(1);
    }
    state = pthread_create(&id2, NULL, bye, &status);
    if(state != 0){
        printf("Could not create thread, exiting.\n");
        exit(1);
    }
    scanf("%c", &status);
    printf("Out of The Threads\n");
    pthread_mutex_destroy(&lock); 
    return 0;
}

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

Starting Threads (Press Enter to terminate)
Hello World
Hello World
Hello World
Hello World
Hello World

Почему только функция приветствия получает функцию печати? Как мне заставить его печатать оба?

1 Ответ

0 голосов
/ 29 апреля 2020

Потому что вы используете инфинитив while в каждой функции hello и bye. Когда начинается первый поток, он никогда не выходит из while l oop, если вы не нажмете enter.

Но когда вы наберете enter, условия l oop во всех функциях будут false, поэтому два потока никогда не коснутся функции print.

OT, вы забыли присоединиться к потокам.

Попробуйте удалить while l oop в каждой функции и использовать ее в функции main, и посмотрите, что произойдет. Например, программа ниже (она может быть не оптимизирована, но я просто хочу показать, почему ваша программа всегда печатает Hello World:

#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
pthread_mutex_t lock;
void print(char a[50]){
    pthread_mutex_lock(&lock);
    printf("%s", a);    //output console is the shared resource
    sleep(2);
    pthread_mutex_unlock(&lock);
}
void* hello(void* status){
   // while(*((char*)status) != '\n'){ 
        print("Hello World\n"); 
    //}
}
void* bye(void* status){
    //while(*((char*)status) != '\n'){
        print("Goodbye World\n");
//    }
}
int main(){
    pthread_t id1, id2;
    char status = '\0';
    int state;
    if (pthread_mutex_init(&lock, NULL) != 0) { 
        printf("\n mutex init has failed\n"); 
        exit(1); 
    }
    printf("Starting Threads (Press Enter to terminate)\n");
    while(status != '\n') {
        state = pthread_create(&id1, NULL, hello, &status);
        if(state != 0){
           printf("Could not create thread, exiting.\n");
           exit(1);
        }
        state = pthread_create(&id2, NULL, bye, &status);
        if(state != 0){
           printf("Could not create thread, exiting.\n");
           exit(1);
        }
        pthread_join(id1, NULL);
        pthread_join(id1, NULL);
        scanf("%c", &status);
    }

    printf("Out of The Threads\n");
    pthread_mutex_destroy(&lock); 
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...