菜鸟笔记
提升您的技术认知

操作系统笔记

进程,线程,协程与并行,并发进程线程协程的区别死锁进程,线程,多线程i++的线程安全性同步和异步孤儿进程和僵尸进程/proc进程信息linux中的分段和分页互斥量 mutex线程进程间通信进程创建进程优先级进程的基础知识进程与线程的区别(面试题)线程的控制(创建,终止,等待,分离)可重入 VS 线程安全死锁的概念一级缓存和二级缓存的理解一句话解说内存屏障 Memory barrierbrk(), sbrk() 用法详解malloc/free函数的简单实现一文讲透 “进程、线程、协程”Linux进程状态线程池的陷阱linux内核学习之进程和线程进程与线程的区别和联系内存寻址linux IO子系统和文件系统读写流程Page cache和buffer cache的区别与联系漫谈linux文件IO多线程和多进程的区别内存泄漏字节、字、位、比特的概念和关系如何避免死锁ANSI是什么编码?CPU寻址范围(寻址空间)CPU 使用率低高负载的原因创建多少个线程合适操作系统下spinlock锁解析、模拟及损耗分析线程堆栈堆和栈的内存分配堆和栈的概念和区别堆和栈的区别,申请方式,程序的内存分配什么是 POD 数据类型Linux内存分配小结--malloc、brk、mmap系统调用与内存管理(sbrk、brk、mmap、munmap)进程描述和控制CPU执行程序的原理编译的基本概念Linux虚拟地址空间布局一个程序从源代码到可执行程序的过程程序的运行机制——CPU、内存、指令的那些事分页内存管理——虚拟地址到物理地址的转换深刻理解Linux进程间通信fork之后父子进程的内存关系fork之后,子进程继承了父进程哪些内容关于协程及其锁的一些认识对协程的一点理解std::thread join和detach区别CAS和ABA问题CAS算法锁和无锁无锁队列的实现Lock-Free 编程锁开销优化以及CAS进程、线程和协程之间的区别和联系多线程的同步与互斥(互斥锁、条件变量、读写锁、自旋锁、信号量)Linux 原来是这么管理内存的线程上下文切换怎么玩儿进程和线程通信原理CPU密集型 和 IO密集型cas原理以及Atomic原子类分析改变线程状态的八个方法六种进程间通信方式进程和线程的区别系统调用进程的概念linux共享内存进程间通讯方式进程的调度线程同步的方式mmap和shm 区别

线程同步的方式

阅读 : 112

线程同步的方式

在多线程编程中,线程同步是保证数据一致性和避免竞态条件的关键。以下是常见的线程同步机制:

  1. 互斥锁 (Mutex)

– 定义: 确保同一时间只有一个线程访问共享资源。

  • 使用场景: 保护临界区代码或共享数据。

  • 示例:

pthread_mutex_t lock;
pthread_mutex_init(&lock, NULL);
pthread_mutex_lock(&lock);
// 临界区操作
pthread_mutex_unlock(&lock);
  1. 信号量 (Semaphore)

– 定义: 计数器控制多个线程对资源的访问。

  • 类型:

  • 二进制信号量 (类似互斥锁)

  • 计数信号量 (限制并发线程数量)

  • 示例:

sem_t sem;
sem_init(&sem, 0, 5); // 初始值5
sem_wait(&sem);       // 申请资源
// 访问资源
sem_post(&sem);       // 释放资源
  1. 条件变量 (Condition Variable)

– 定义: 允许线程在特定条件满足时唤醒其他线程。

  • 依赖: 必须与互斥锁配合使用。

  • 示例:

pthread_cond_t cond;
pthread_mutex_t mutex;
// 线程A等待条件
pthread_mutex_lock(&mutex);
while (condition_not_met) {
    pthread_cond_wait(&cond, &mutex);
}
// 执行操作
pthread_mutex_unlock(&mutex);

// 线程B通知条件变化
pthread_cond_signal(&cond);
  1. 读写锁 (Read-Write Lock)
  • 定义: 区分读锁(共享)和写锁(独占)。

  • 适用场景: 读多写少的数据访问。

  • 示例:

pthread_rwlock_t rwlock;
pthread_rwlock_rdlock(&rwlock);  // 读锁
// 读取数据
pthread_rwlock_unlock(&rwlock);

pthread_rwlock_wrlock(&rwlock);  // 写锁
// 修改数据
pthread_rwlock_unlock(&rwlock);
  1. 自旋锁 (Spinlock)

– 定义: 线程忙等待锁释放,不进入睡眠状态。

  • 适用场景: 锁持有时间极短的场景。

  • 注意: 可能浪费CPU资源。

  • 示例:

spinlock_t lock;
spin_lock(&lock);
// 临界区操作
spin_unlock(&lock);
  1. 屏障 (Barrier)

– 定义: 使多个线程在指定点同步等待。

  • 适用场景: 并行计算分阶段处理。

  • 示例:

pthread_barrier_t barrier;
pthread_barrier_init(&barrier, NULL, 3); // 等待3个线程
// 线程执行到屏障点等待
pthread_barrier_wait(&barrier);
  1. 原子操作 (Atomic Operations)

– 定义: 通过硬件支持的不可中断操作保证数据一致性。

  • 示例 (C11):
#include <stdatomic.h>
atomic_int counter = ATOMIC_VAR_INIT(0);
atomic_fetch_add(&counter, 1);  // 原子加法
  1. 事件 (Event)

– 定义: 通知机制(如Windows API)。

  • 示例:
HANDLE event = CreateEvent(NULL, TRUE, FALSE, NULL);
// 等待事件
WaitForSingleObject(event, INFINITE);
// 触发事件
SetEvent(event);
  1. 线程局部存储 (Thread-Local Storage, TLS)

– 定义: 每个线程拥有独立变量副本。

  • 适用场景: 避免共享数据的同步问题。

  • 示例 (C++11):

thread_local int thread_specific_data = 0;