类函数(即类的成员函数)确实可以被线程调用,并且可以访问类数据。然而,在多线程环境中访问类数据时,需要特别注意线程安全问题,以避免数据竞争和不一致的状态。
问题:多个线程同时读写类的共享数据可能导致数据不一致或损坏。 原因:没有适当的同步机制来控制对共享资源的访问。
#include <iostream>
#include <thread>
#include <mutex>
class Counter {
public:
void increment() {
std::lock_guard<std::mutex> lock(mtx); // 使用锁保护共享资源
++count;
}
int getCount() const {
return count;
}
private:
mutable std::mutex mtx; // 互斥锁
int count = 0;
};
void threadFunc(Counter& counter) {
for(int i = 0; i < 1000; ++i) {
counter.increment();
}
}
int main() {
Counter counter;
std::thread t1(threadFunc, std::ref(counter));
std::thread t2(threadFunc, std::ref(counter));
t1.join();
t2.join();
std::cout << "Final count: " << counter.getCount() << std::endl; // 应该输出2000
return 0;
}
在这个例子中,Counter
类的 increment
方法使用了 std::lock_guard
来自动管理互斥锁,确保每次只有一个线程可以增加计数器的值,从而保证了线程安全。
通过这种方式,类函数不仅可以被线程调用,而且可以安全地访问和修改类数据。
领取专属 10元无门槛券
手把手带您无忧上云