具有多个线程的程序总是提供相同的输出

问题描述 投票:0回答:1

我正在学习多线程,并尝试创建一个可以交替打印两个字符串的程序。我写了以下代码:

#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;
}

根据我的理解,互斥锁应该为hello函数锁定一次打印功能,然后再为bye函数锁定一次。但是我只能得到以下输出:

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

为什么只向hello函数分配打印函数?如何获得同时打印的内容?

c multithreading mutex thread-synchronization
1个回答
0
投票

因为在每个功能whilehello中使用不定式bye。您应该在功能中使用删除循环,然后在main功能中使用它。

© www.soinside.com 2019 - 2024. All rights reserved.