C 使此简单代码线程安全

C 使此简单代码线程安全,c,multithreading,thread-safety,C,Multithreading,Thread Safety,我刚刚很好地使用了多线程。像这样的我必须学习多线程。我有一个非常简单的程序: void *listenloop(void *arg){ while (1){ Sleep(2000); puts("testing 123\n"); } return NULL; } int main(){ pthread_t listener; pthread_create(&listener,NULL,listenloop,"foo"); char t

我刚刚很好地使用了多线程。像这样的我必须学习多线程。我有一个非常简单的程序:

void *listenloop(void *arg){

    while (1){
       Sleep(2000);
       puts("testing 123\n");
   }
   return NULL;
}


int main(){
pthread_t listener;
pthread_create(&listener,NULL,listenloop,"foo");
char testinput[200];
while(1){
    puts("Scanning: ");
    scanf("%s",testinput);
    puts("\n\n");
    printf("You typed: %s: ",testinput);
}
}

其原理是,它等待用户输入,并响应用户输入,同时定期打印

事实上,这一点也不让我感到惊讶(我的上级可能也很清楚),结果是“一团糟”

现在我可以想出几种解决这个问题的方法,但没有实际的解决办法。这种性质的东西应该如何实施?在向用户显示程序后,是否可以通过操纵程序的输出来完成


谢谢

在原始代码中,该代码中不应该有“混乱”的输出(无论如何都是由线程引起的),因为只有一个线程(主线程)在执行任何输出

另一个线程所做的唯一事情就是以某种延迟无限循环

现在,您已经将问题更新为从另一个线程输出,那么,是的,输出可以混合

有几种方法可以解决这个问题,两种方法会立即浮现在脑海中

  • 让所有输出都通过一系列互斥保护输出流的函数,例如
    mutexed_printf()/mutexed_put()
    (需要提供)(a)
  • 执行其中一个线程的所有输出,这意味着另一个线程必须通过某种方式(像队列一样的线程间通信)向其发送数据——这样所有输出都可以正确混合,例如在换行边界上


  • (a) 还请记住,如果您想要为用户输入操作对输出流进行互斥保护,那么您可能需要以原子方式保护
    put/scanf
    ,以便测试输出不会干扰您的输入(通过在提示后但在输入之前/期间输出消息)。如果使用
    mutexd_put()
    函数,这是不可能的,您将需要一个扩展的
    mutexd_提示符_和_输入()
    一个。

    因此,只需使用一个pthread_mutex_锁定/解锁pthread_mutex_,就可以了


    你是说输出混乱了?看起来对我来说应该没问题。向我们展示它的功能以及您希望它做什么。此外,也没有“事后”抱歉的家伙。修复了代码…这不是一个真正的答案,应该只是一个注释。@xaxxon,这是一个答案,说明OP认为发生的事情不可能发生。这方面有很多先例。无论如何,现在问题已经编辑好了,我在答案中添加的额外信息使我认为这是一个有用的答案。希望你会同意。通常当这种情况发生时,这仅仅意味着他们错误地复制了一些代码。一条简单的注释说明代码没有按照他们说的做,这通常被认为是正确的方法,因此,这种类型的非答案会有一个标志。首先,你用“答案”复制我的注释,然后你再发布我的答案?俗气的,我建议你再看看。我的互斥锁解决方案不是按照您的方法在代码中添加锁,而是提供带有本地化锁的输出函数的修改实现,从而减少调用代码中对锁管理的需要。这只是两种可能性中的一种,这两种可能性都是由于问题编辑而不是您的答案而添加的。。。这并不能解决在输入操作期间出现输出的问题,甚至不能编译。您通常应该检查您在这里发布的代码,以确保其可用。
    pthread_mutex_t = PTHREAD_MUTEX_INITIALIZER; 
    
    void *listenloop(void *arg){
    
        while (1){
           Sleep(2000);
           pthread_mutex_lock(&mutex);
           puts("testing 123\n");
           pthread_mutex_unlock(&mutex);
       }
       return NULL;
    }
    
    
    int main(){
    pthread_t listener;
    pthread_create(&listener,NULL,listenloop,"foo");
    char testinput[200];
    while(1){
    
        pthread_mutex_lock(&mutex);
        puts("Scanning: ");
        pthread_mutex_unlock(&mutex);
    
        scanf("%s",testinput);
    
        pthread_mutex_lock(&mutex);
        puts("\n\n");
        printf("You typed: %s: ",testinput);
        pthread_mutex_unlock(&mutex);
    
    }
    }