温馨提示×

C++中stdin在多线程环境下的使用

c++
小樊
82
2024-09-10 17:28:19
栏目: 编程语言

在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),因为一个线程可能会长时间等待获取互斥锁。为了避免这种情况,可以使用条件变量或其他同步原语来实现更复杂的线程调度策略。

0