多线程面试题

51 阅读1分钟

题目1:

  1. 我有N个线程,分别对count++,执行500次,count最小是多少?

    A:回答

    1. T1执行count++,但是并没有写入内存。
    2. T2-TN-1执行完毕,此时count可以是x
    3. 但是此时TN只执行了499次。
    4. T1把count写入内存。count=1.
    5. TN读取count的值去执行第500次自增,但是此时读出count=1
    6. T1一直不断的往下执行。一直到执行结束。
    7. Tn对count执行++并写入,count=2
  2. 题目:子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码

    #include <iostream>
    #include <thread>
    #include <mutex>
    #include <condition_variable>
    
    // --- 全局共享资源 ---
    std::mutex mtx; // 互斥锁,保护共享状态
    std::condition_variable cv; // 条件变量,用于线程间的通知与等待
    bool sub_thread_turn = true; // 共享状态,true表示该子线程执行
    
    // --- 子线程的任务函数 ---
    void sub_task() {
        for (int i = 0; i < 50; ++i) {
            std::unique_lock<std::mutex> lock(mtx);
            cv.wait(lock, [] { return sub_thread_turn; });
    
            std::cout << "------ 子线程开始第 " << (i + 1) << " 轮循环 ------" << std::endl;
            for (int j = 0; j < 10; ++j) {
                std::cout << "Sub thread running: " << j + 1 << std::endl;
            }
    
            // 更改状态,轮到主线程执行
            sub_thread_turn = false;
    
            // 通知一个正在等待的线程(这里是主线程)
            cv.notify_one();
        }
    }
    
    int main() {
        // 创建并启动子线程
        std::thread t(sub_task);
        for (int i = 0; i < 50; ++i) {
            std::unique_lock<std::mutex> lock(mtx);
            cv.wait(lock, [] { return !sub_thread_turn; });
    
            std::cout << "------ 主线程开始第 " << (i + 1) << " 轮循环 ------" << std::endl;
            for (int j = 0; j < 100; ++j) {
                std::cout << "Main thread running: " << j + 1 << std::endl;
            }
            sub_thread_turn = true;
            cv.notify_one();
        }
        if (t.joinable()) {
            t.join();
        }
        return 0;
    }
    
  3. s