1)PTHREAD_MUTEX_NOMAL:标准互斥锁,第一次上锁成功,第二次上锁会失败并阻塞; 2)PTHREAD_MUTEX_RECURSIVE:递归互斥锁,第一次上锁成功,第二次上锁还是会成功,可以理解为内部有一个计数器,每加一次锁计数器加1,解锁减1; 3)PTHREAD_MUTEX_ERRORCHECK:检查互斥锁,第一次上锁会成功,第二次上锁出错返回错误信息,不会...
join(); } } private: int num_threads_; ///< 线程数量 std::vector<std::thread> threads_; ///< 线程列表 std::array<std::mutex, 5> mutexes_; ///< 互斥量数组 /** * @brief 线程执行的工作 * * @param thread_id 线程的ID */ void threadWork(int thread_id) { // 使用 std::...
B:std::shared_mutex 基本原理 要实现读写分离的控制,要依赖下面两个锁,不只是 shared_mutex就可以。 (1)std::shared_lock(共享锁) 允许多个线程同时获取锁进行读操作。 当一个线程持有共享锁时,其他线程可以继续获取共享锁,但不能获取独占锁。 实现共享锁的类是 std::shared_lock。 (2)std::unique_lock(...
std::mutex mtx; std::condition_variable cv; bool ready = false; void main_thread() { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, [] { return ready; }); // ... continue processing when ready ... } 在这个示例中,谓词是一个 Lambda 表达式 [] { return ready; },它...
原理与特点: 实现共享所有权(shared ownership)的智能指针。多个shared_ptr实例可以同时指向并共享同一个对象。 内部维护一个引用计数(reference count)。每当新的shared_ptr拷贝或赋值现有shared_ptr时,引用计数递增;当shared_ptr销毁或重置时,引用计数递减。当引用计数降至零时,自动删除所管理的对象。
在多线程程序中,共享变量的读写可能会发生竞态条件(race condition)。传统的锁(如std::mutex)可以解决这个问题,但锁的使用会导致性能下降。而std::atomic通过底层硬件的支持,实现了高效的原子操作,无需额外加锁。 关键点:std::atomic是 C++11 引入的,用于简化并发编程,同时保证线程安全。
任务队列是一种常见的多线程设计模式,允许多个生产者线程提交任务,然后由一个或多个消费者线程执行这些任务。std::packaged_task非常适合用来实现任务队列,因为它可以将任意的可调用对象封装成一个统一的接口。 #include <queue>#include <future>#include <mutex>// 任务队列std::queue<std::packaged_task<int()...
在这个例子中,Counter类的对象由std::shared_ptr管理,并在多个线程中共享,在thread_func函数中,每次调用counter->increment()前,都用std::lock_guard<std::mutex>锁定mtx,保证每次访问increment()是原子操作,std::lock_guard是RAII风格的锁管理器,它会在代码块结束时自动释放锁。启动 10 个线程,每个线程对共享计...
#include<mutex>/*std::mutex、 std::lock_guard*/#include<iostram>std::mutex mutex;int counter=0;voidtestFunc(){//lock_guard 互斥锁 作用域内上锁std::lock_guard<std::mutex>lockGuard(mutex);//函数体counter++;}//函数结束时,作用域结束,自动释放intmain(){testFunc();std::cout<<"counter ...
} void writer(int id, int value) { std::unique_lock<std::shared_timed_mutex> lock(mtx); // 使用独占锁写入 std::cout << "Writer " << id << " is writing data... "; // 执行写操作,例如: data.push_back(value); } int main() { std::vector<...