MST

星途 面试题库

面试题:C++中assert()函数在多线程环境下的应用问题

在一个多线程的C++程序中使用`assert()`函数来检查某个共享资源的状态。假设共享资源是一个全局变量`int sharedVariable`,在一个线程中对其进行修改,另一个线程中使用`assert()`检查它是否符合特定条件(比如大于0)。请描述在这种场景下可能出现的问题以及如何避免。
15.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

可能出现的问题

  1. 竞态条件:由于sharedVariable是共享资源,一个线程修改它,另一个线程检查它,在修改和检查之间可能存在时间窗口,导致检查结果不准确。例如,修改线程刚把sharedVariable设为大于0,在检查线程执行assert前,另一个修改线程又把它设为小于0 ,这样assert可能会误判。
  2. 死锁:如果为了保护sharedVariable使用互斥锁等同步机制,在使用不当的情况下,比如两个线程相互等待对方释放锁,就可能导致死锁。

避免方法

  1. 使用同步机制
    • 互斥锁:在修改和检查sharedVariable时都加锁,确保同一时间只有一个线程能访问它。示例代码如下:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
int sharedVariable = 0;
void modifyThread() {
    std::lock_guard<std::mutex> lock(mtx);
    sharedVariable = 1;
}
void checkThread() {
    std::lock_guard<std::mutex> lock(mtx);
    assert(sharedVariable > 0);
}
int main() {
    std::thread t1(modifyThread);
    std::thread t2(checkThread);
    t1.join();
    t2.join();
    return 0;
}
- **条件变量**:当`sharedVariable`满足条件时,通过条件变量通知检查线程,避免无效的`assert`检查。

2. 原子操作:如果sharedVariable的操作简单,使用原子类型std::atomic<int>,它提供了原子操作,无需使用锁就能保证操作的原子性,避免竞态条件。示例代码如下:

#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> sharedVariable(0);
void modifyThread() {
    sharedVariable = 1;
}
void checkThread() {
    assert(sharedVariable.load() > 0);
}
int main() {
    std::thread t1(modifyThread);
    std::thread t2(checkThread);
    t1.join();
    t2.join();
    return 0;
}