1、可重入锁是指同一个线程可以多次获得同一个锁而不会造成死锁的锁。也就是说,线程在持有锁的情况下,可以再次请求该锁而不会被自己阻塞。\n2、在C++中,有以下可重入锁:\n- std::recursive_mutex:递归互斥锁,可以被同一线程多次获得。当同一线程多次请求该锁时,只需在最后一次解锁时才会真正释放锁。\n- std::recursive_timed_mutex:递归定时互斥锁,与递归互斥锁类似,但支持超时等待。\nC++中没有明确定义不可重入锁,但可以通过使用普通互斥锁(std::mutex)来实现不可重入锁的效果。\n3、一个C++可重入锁的例子如下:\ncpp\n#include <iostream>\n#include <thread>\n#include <mutex>\n\nstd::recursive_mutex mtx;\n\nvoid func(int n) {\n std::lock_guard<std::recursive_mutex> lock(mtx); // 获取锁\n std::cout << "Thread " << n << " acquired the lock." << std::endl;\n if (n > 0) {\n func(n - 1); // 递归调用函数,再次获取锁\n }\n std::cout << "Thread " << n << " released the lock." << std::endl;\n}\n\nint main() {\n std::thread t(func, 3);\n t.join();\n return 0;\n}\n\n一个C++不可重入锁的例子如下:\ncpp\n#include <iostream>\n#include <thread>\n#include <mutex>\n\nstd::mutex mtx;\n\nvoid func(int n) {\n std::unique_lock<std::mutex> lock(mtx); // 获取锁\n std::cout << "Thread " << n << " acquired the lock." << std::endl;\n if (n > 0) {\n func(n - 1); // 递归调用函数,再次请求锁会造成死锁\n }\n std::cout << "Thread " << n << " released the lock." << std::endl;\n}\n\nint main() {\n std::thread t(func, 3);\n t.join();\n return 0;\n}\n\n4、C++不可重入锁的优点是简单易用,没有额外的开销。缺点是在同一线程内进行递归调用时会造成死锁,限制了代码的灵活性。\nC++可重入锁的优点是可以在同一线程内进行递归调用而不会造成死锁,提供了更高的灵活性。缺点是相对于普通互斥锁,可重入锁可能会有一些额外的开销。

C++ 可重入锁:概念、类型、示例及优缺点

原文地址: https://www.cveoy.top/t/topic/pBCQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录