getchar在多线程环境中如何使用

avatar
作者
猴君
阅读量:0

getchar 是一个 C 语言库函数,用于从标准输入(通常是键盘)读取一个字符。在多线程环境中使用 getchar 时,需要注意线程安全和同步问题。以下是一些建议:

  1. 使用互斥锁(mutex):在多线程环境中,可以使用互斥锁来保护 getchar 的调用。当一个线程正在使用 getchar 时,其他线程将被阻塞,直到互斥锁被释放。这可以确保在同一时刻只有一个线程能够调用 getchar
#include <stdio.h> #include <stdlib.h> #include <pthread.h>  pthread_mutex_t lock;  void* thread_func(void* arg) {     char ch;     pthread_mutex_lock(&lock);     ch = getchar();     pthread_mutex_unlock(&lock);     // 处理字符 ch     return NULL; }  int main() {     pthread_t threads[4];     pthread_mutex_init(&lock, NULL);      for (int i = 0; i < 4; ++i) {         pthread_create(&threads[i], NULL, thread_func, NULL);     }      for (int i = 0; i < 4; ++i) {         pthread_join(threads[i], NULL);     }      pthread_mutex_destroy(&lock);     return 0; } 
  1. 使用条件变量(condition variable):条件变量可以用于线程间的同步,当一个线程等待某个条件成立时,其他线程可以通知它。在这种情况下,可以使用条件变量来通知等待 getchar 的线程。
#include <stdio.h> #include <stdlib.h> #include <pthread.h>  pthread_mutex_t lock; pthread_cond_t cond; int data = 0;  void* thread_func(void* arg) {     char ch;     pthread_mutex_lock(&lock);     while (data == 0) {         pthread_cond_wait(&cond, &lock);     }     ch = data;     data = 0;     pthread_mutex_unlock(&lock);     // 处理字符 ch     return NULL; }  void input_func() {     char ch;     pthread_mutex_lock(&lock);     ch = getchar();     data = ch;     pthread_cond_signal(&cond);     pthread_mutex_unlock(&lock); }  int main() {     pthread_t threads[4];     pthread_mutex_init(&lock, NULL);     pthread_cond_init(&cond, NULL);      for (int i = 0; i < 4; ++i) {         pthread_create(&threads[i], NULL, thread_func, NULL);     }      for (int i = 0; i < 4; ++i) {         input_func();     }      for (int i = 0; i < 4; ++i) {         pthread_join(threads[i], NULL);     }      pthread_mutex_destroy(&lock);     pthread_cond_destroy(&cond);     return 0; } 

这两种方法都可以确保在多线程环境中安全地使用 getchar。你可以根据你的需求和场景选择合适的方法。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!