MST

星途 面试题库

面试题:C++中static函数线程安全性基础分析

在C++ 中,简述static函数在多线程环境下潜在的线程安全问题,并举例说明如果函数内部有静态局部变量可能会出现什么状况。
20.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

1. static函数在多线程环境下潜在的线程安全问题

  • 共享资源竞争:当多个线程同时调用static函数时,如果函数内部使用了共享资源(如全局变量、静态变量等),就可能出现竞争条件。由于static函数在整个程序中只有一份实例,多个线程同时访问和修改这些共享资源,可能导致数据不一致。
  • 未同步访问static函数自身并不会自动提供线程同步机制。如果多个线程同时进入static函数并对共享资源进行读写操作,没有适当的同步手段(如互斥锁),就会引发线程安全问题。

2. 函数内部有静态局部变量可能出现的状况

  • 初始化竞争:在多线程环境下,当多个线程首次调用包含静态局部变量的函数时,可能会同时尝试初始化该静态局部变量。这可能导致重复初始化,进而产生未定义行为或数据不一致。

示例代码

#include <iostream>
#include <thread>
#include <mutex>

// 互斥锁,用于线程同步
std::mutex mtx;

// 包含静态局部变量的函数
void increment() {
    static int count = 0; // 静态局部变量
    // 未加锁时,多线程同时访问会有问题
    // count++;

    // 使用互斥锁同步访问
    std::lock_guard<std::mutex> lock(mtx);
    count++;
    std::cout << "Thread " << std::this_thread::get_id() << " count: " << count << std::endl;
}

int main() {
    std::thread threads[10];
    // 创建10个线程并启动
    for (int i = 0; i < 10; ++i) {
        threads[i] = std::thread(increment);
    }

    // 等待所有线程完成
    for (auto& th : threads) {
        th.join();
    }

    return 0;
}

在上述代码中,如果没有std::lock_guard<std::mutex> lock(mtx);这部分同步代码,多个线程同时对count进行自增操作时,就可能出现数据不一致的情况。例如,可能期望最终count的值为10,但实际可能小于10,因为不同线程的自增操作相互干扰。通过添加互斥锁,确保了同一时间只有一个线程能访问和修改count,从而保证了线程安全。