Потому что вы используете инфинитив 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;
}