在C++中,线程锁(std::mutex)可以用于保护共享资源,以避免多个线程同时访问和修改。在main函数中直接调用lock和unlock的方式与在类中调用是一样的。下面是一些示例代码,演示了在main函数和类成员函数中使用线程锁的方式。
首先是在main函数中的示例:#include <iostream>#include <thread>#include <mutex>std::mutex mtx; // 保护counterint counter = 0;void increment() { std::lock_guard<std::mutex> lock(mtx); // 加锁 // 对共享资源进行操作 ++counter; // 在作用域结束时自动解锁}int main() { std::thread t1(increment); std::thread t2(increment); t1.join(); t2.join(); std::cout << "Counter: " << counter << std::endl; return 0;}
在上述代码中,我们在main函数外部声明了一个std::mutex对象mtx,用于保护共享资源counter。在increment函数中,我们使用std::lock_guard来创建一个互斥锁,并自动加锁。这样可以确保在对counter进行操作时,只有一个线程能够访问它,避免了竞态条件。
接下来是在类成员函数中使用线程锁的示例:#include <iostream>#include <thread>#include <mutex>class Counter {public: void increment() { std::lock_guard<std::mutex> lock(mtx); // 加锁 // 对共享资源进行操作 ++counter; // 在作用域结束时自动解锁 } void print() { std::lock_guard<std::mutex> lock(mtx); // 加锁 // 对共享资源进行操作 std::cout << "Counter: " << counter << std::endl; // 在作用域结束时自动解锁 }private: std::mutex mtx; // 保护counter int counter = 0;};int main() { Counter c; std::thread t1(&Counter::increment, &c); std::thread t2(&Counter::increment, &c); t1.join(); t2.join(); c.print(); return 0;}
在上述代码中,我们创建了一个名为Counter的类,其中包含了两个成员函数increment和print。我们在类的私有成员中声明了一个std::mutex对象mtx,用于保护共享资源counter。在类的成员函数中,我们使用std::lock_guard来创建一个互斥锁,并自动加锁。这样可以确保在对counter进行操作时,同一时间只有一个线程能够访问它。
希望这次回答能够帮助到你。如果还有其他问题,请随时提问。
如果回答对你有帮助,请给我一个最佳答案!
|