在Linux系统中,多个线程等待输入的情况通常涉及到多线程编程和同步机制。以下是对这个问题的详细解答:
线程:线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
等待输入:指的是线程在执行过程中需要暂停,直到接收到外部输入(如键盘输入、文件描述符上的数据到达等)后再继续执行。
同步机制:为了保证多线程程序的正确性,需要使用同步机制来协调不同线程之间的执行顺序和访问共享资源的时机。
类型:
应用场景:
问题:两个线程同时等待输入时,可能会出现竞争条件或不必要的等待。
原因:
互斥锁可以确保同一时间只有一个线程访问输入源。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int input_ready = 0;
void* thread_func(void* arg) {
while (1) {
pthread_mutex_lock(&mutex);
if (input_ready) {
// 处理输入
input_ready = 0;
pthread_mutex_unlock(&mutex);
break;
}
pthread_mutex_unlock(&mutex);
// 可以在这里执行其他任务
}
return NULL;
}
int main() {
pthread_t thread1, thread2;
pthread_create(&thread1, NULL, thread_func, NULL);
pthread_create(&thread2, NULL, thread_func, NULL);
// 模拟输入到达
pthread_mutex_lock(&mutex);
input_ready = 1;
pthread_mutex_unlock(&mutex);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
return 0;
}
条件变量允许线程在特定条件满足时被唤醒。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int input_ready = 0;
void* thread_func(void* arg) {
pthread_mutex_lock(&mutex);
while (!input_ready) {
pthread_cond_wait(&cond, &mutex);
}
// 处理输入
input_ready = 0;
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t thread1, thread2;
pthread_create(&thread1, NULL, thread_func, NULL);
pthread_create(&thread2, NULL, thread_func, NULL);
// 模拟输入到达
pthread_mutex_lock(&mutex);
input_ready = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
return 0;
}
通过使用互斥锁和条件变量,可以有效管理多个线程等待输入的情况,避免竞争条件和提高程序效率。
领取专属 10元无门槛券
手把手带您无忧上云