面试题答案
一键面试在C++中,可以使用<mutex>
库来避免数据竞争问题。mutex
(互斥锁)用于保护共享资源,确保同一时间只有一个线程可以访问该资源。
以下是代码示例:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
int globalVar = 0;
void increment() {
for (int i = 0; i < 10000; ++i) {
mtx.lock();
globalVar++;
mtx.unlock();
}
}
void decrement() {
for (int i = 0; i < 10000; ++i) {
mtx.lock();
globalVar--;
mtx.unlock();
}
}
int main() {
std::thread t1(increment);
std::thread t2(decrement);
t1.join();
t2.join();
std::cout << "Final value of globalVar: " << globalVar << std::endl;
return 0;
}
在上述代码中:
- 定义了一个全局的
std::mutex mtx
对象。 increment
函数和decrement
函数在对globalVar
进行操作前,先调用mtx.lock()
锁定互斥锁,操作完成后调用mtx.unlock()
解锁互斥锁。这样就保证了同一时间只有一个线程可以修改globalVar
,避免了数据竞争。- 在
main
函数中创建并启动两个线程,分别执行increment
和decrement
函数,最后等待两个线程执行完毕,并输出globalVar
的最终值。
另外,也可以使用std::lock_guard
来简化锁的管理,std::lock_guard
在构造函数中自动锁定互斥锁,在析构函数中自动解锁互斥锁,修改后的代码如下:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
int globalVar = 0;
void increment() {
for (int i = 0; i < 10000; ++i) {
std::lock_guard<std::mutex> lock(mtx);
globalVar++;
}
}
void decrement() {
for (int i = 0; i < 10000; ++i) {
std::lock_guard<std::mutex> lock(mtx);
globalVar--;
}
}
int main() {
std::thread t1(increment);
std::thread t2(decrement);
t1.join();
t2.join();
std::cout << "Final value of globalVar: " << globalVar << std::endl;
return 0;
}
这种方式更简洁且安全,因为即使在函数执行过程中发生异常,std::lock_guard
也能保证互斥锁被正确解锁。