0

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

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

}

理论是它等待用户输入,回显它,同时定期打印。

毫不让我惊讶的是,实际上(对于我在这件事上的更好的人来说,很明显)输出是“一团糟”。

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

谢谢!

4

2 回答 2

0

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

另一个线程唯一做的就是无限循环并有某种延迟。

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

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

  1. 让所有输出通过一系列互斥保护输出流的功能,例如mutexed_printf()/mutexed_puts()(您需要提供)(a)
  2. 从一个线程执行所有输出,这意味着另一个线程必须通过某种方式(如队列的线程间通信)向它发送数据——这样所有输出都可以正确混合,例如在换行符边界上。

(a)还要记住,如果你想为用户输入操作互斥保护输出流,你可能想保护puts/scanf原子,这样测试输出就不会弄乱你的输入(通过在之后输出消息提示但在您输入之前/期间)。使用函数是不可能的mutexed_puts(),你需要一个扩展mutexed_prompt_and_input()的。

于 2013-07-04T02:41:59.513 回答
0

因此,只需使用单个 pthread_mutex_t 将打印件包装在 pthread_mutex_lock/unlocks 中,就可以了。

http://linux.die.net/man/3/pthread_mutex_lock

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);

}
}
于 2013-07-04T02:44:39.853 回答