在C++中,stdin
是一个全局变量,用于从标准输入(通常是键盘)读取数据
然而,在实际应用中,我们可以使用互斥锁(mutex)来确保在任何时候只有一个线程能够访问stdin
。这样可以避免数据竞争和不一致的问题。
以下是一个简单的示例,展示了如何在多线程环境下使用stdin
:
#include<iostream>
#include<thread>
#include <mutex>
std::mutex mtx; // 用于保护stdin的互斥锁
void read_input(int thread_id) {
std::unique_lock<std::mutex> lock(mtx); // 获取互斥锁
std::cout << "Thread "<< thread_id << " is reading from stdin: ";
int input;
std::cin >> input;
std::cout << "Thread "<< thread_id << " read: "<< input<< std::endl;
lock.unlock(); // 释放互斥锁
}
int main() {
std::thread t1(read_input, 1);
std::thread t2(read_input, 2);
t1.join();
t2.join();
return 0;
}
在这个示例中,我们创建了两个线程,它们都会调用read_input
函数。read_input
函数首先获取互斥锁,然后从stdin
读取一个整数,并将其打印到控制台。当线程完成输入操作后,它会释放互斥锁,允许其他线程访问stdin
。
需要注意的是,这种方法可能会导致线程饥饿(starvation),因为一个线程可能会长时间等待获取互斥锁。为了避免这种情况,可以使用条件变量或其他同步原语来实现更复杂的线程调度策略。