在 c++++ 多线程编程中,同步原语的作用是保证多个线程访问共享资源时的正确性,它包括:互斥锁(mutex):保护共享资源,防止同时访问;条件变量(condition variable):线程等待特定条件满足才继续执行;原子操作:保证操作以不可中断的方式执行。
C++ 并发编程中的同步原语详解
在多线程编程中,同步原语是至关重要的,它可以保证多个线程访问共享资源时的正确性。C++ 提供了丰富的同步原语,包括互斥锁、条件变量和原子操作。
互斥锁 (Mutex)
互斥锁是一个用于保护共享资源的同步机制。当一个线程获得互斥锁后,其他线程将被阻塞,直到互斥锁被释放。在 C++ 中,可以使用 std::mutex 类来实现互斥锁:
std::mutex mtx; // ... { // 获取互斥锁 std::lock_guard<std::mutex> lock(mtx); // 临界区 } // 互斥锁在离开<a style='color:#f60; text-decoration:underline;' href="https://www.php.cn/zt/35787.html" target="_blank">作用域</a>时自动释放
登录后复制
条件变量 (Condition Variable)
条件变量允许线程等待某个特定条件满足才继续执行。在 C++ 中,可以使用 std::condition_variable 类来实现条件变量:
std::condition_variable cv; // ... { std::unique_lock<std::mutex> lock(mtx); // 等待条件满足 cv.wait(lock); // 执行条件满足后要执行的代码 }
登录后复制
原子操作
原子操作保证一个操作以不可中断的方式执行。在 C++ 中,可以使用 atomic 库来进行原子操作:
std::atomic<int> counter; // ... counter++; // 原子地增加 counter 的值
登录后复制
实战案例
考虑一个有共享计数器和写入线程的程序。写入线程需要原子地增加计数器,而读取线程需要保护地读取计数器:
std::atomic<int> counter; std::mutex mtx; // 写入线程 void write_thread() { while (true) { // 原子地增加计数器 counter++; } } // 读取线程 void read_thread() { while (true) { // 保护地读取计数器 std::lock_guard<std::mutex> lock(mtx); std::cout << "Counter: " << counter << std::endl; } } int main() { std::thread t1(write_thread); std::thread t2(read_thread); t1.join(); t2.join(); return 0; }
登录后复制
以上就是C++ 并发编程中的同步原语详解的详细内容,更多请关注叮当号网其它相关文章!
文章来自互联网,只做分享使用。发布者:pansz,转转请注明出处:https://www.dingdanghao.com/article/501947.html