线程间通信(Thread Inter-Communication, TIC)是指在一个进程内的多个线程之间进行数据交换和同步的方法。与进程间通信相比,线程间通信通常更简单、更高效,因为它们共享相同的内存空间。下面是一些常见的线程间通信机制及其相关API:
1. 临界区(Critical Sections)
- 说明:临界区是一种轻量级的互斥机制,用于保护共享资源免受多个线程的同时访问。
- 作用:确保每次只有一个线程可以访问共享资源。
- 适用场景:当需要保护共享变量或数据结构时。
- API:
- POSIX:
pthread_mutex_t
: 互斥锁类型。pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
: 初始化互斥锁。pthread_mutex_lock(pthread_mutex_t *mutex)
: 锁定互斥锁。pthread_mutex_unlock(pthread_mutex_t *mutex)
: 解锁互斥锁。pthread_mutex_destroy(pthread_mutex_t *mutex)
: 销毁互斥锁。
- Windows:
CRITICAL_SECTION
: 临界区类型。InitializeCriticalSection(CRITICAL_SECTION *lpCriticalSection)
: 初始化临界区。EnterCriticalSection(CRITICAL_SECTION *lpCriticalSection)
: 进入临界区。LeaveCriticalSection(CRITICAL_SECTION *lpCriticalSection)
: 离开临界区。DeleteCriticalSection(CRITICAL_SECTION *lpCriticalSection)
: 删除临界区。
- POSIX:
2. 互斥锁(Mutexes)
- 说明:互斥锁是一种更通用的同步机制,可以保护共享资源免受多个线程的同时访问。
- 作用:确保每次只有一个线程可以访问共享资源。
- 适用场景:当需要保护共享变量或数据结构时。
- API:
- POSIX:
pthread_mutex_t
: 互斥锁类型。pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
: 初始化互斥锁。pthread_mutex_lock(pthread_mutex_t *mutex)
: 锁定互斥锁。pthread_mutex_unlock(pthread_mutex_t *mutex)
: 解锁互斥锁。pthread_mutex_destroy(pthread_mutex_t *mutex)
: 销毁互斥锁。
- Windows:
CreateMutex
: 创建互斥对象。WaitForSingleObject
: 等待互斥对象。ReleaseMutex
: 释放互斥对象。CloseHandle
: 关闭互斥对象。
- POSIX:
3. 条件变量(Condition Variables)
- 说明:条件变量与互斥锁一起使用,用于协调多个线程的执行。
- 作用:使得线程可以等待某个条件变为真。
- 适用场景:当线程需要等待某些条件满足时。
- API:
- POSIX:
pthread_cond_t
: 条件变量类型。pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *cond_attr)
: 初始化条件变量。pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
: 等待条件变量。pthread_cond_signal(pthread_cond_t *cond)
: 唤醒一个等待的线程。pthread_cond_broadcast(pthread_cond_t *cond)
: 唤醒所有等待的线程。pthread_cond_destroy(pthread_cond_t *cond)
: 销毁条件变量。
- Windows:
CreateEvent
: 创建事件对象。SetEvent
: 设置事件对象。ResetEvent
: 重置事件对象。WaitForSingleObject
: 等待事件对象。CloseHandle
: 关闭事件对象。
- POSIX:
4. 自旋锁(Spinlocks)
- 说明:自旋锁是一种轻量级的锁机制,主要用于短时间内保护共享资源。
- 作用:在线程尝试获取锁时,如果锁已被占用,则线程会忙等待直到锁可用。
- 适用场景:当锁的持有时间很短,频繁地获取和释放锁时。
- API:
- POSIX:
pthread_spinlock_t
: 自旋锁类型。pthread_spin_init(pthread_spinlock_t *lock, int pshared)
: 初始化自旋锁。pthread_spin_lock(pthread_spinlock_t *lock)
: 锁定自旋锁。pthread_spin_unlock(pthread_spinlock_t *lock)
: 解锁自旋锁。pthread_spin_destroy(pthread_spinlock_t *lock)
: 销毁自旋锁。
- POSIX:
5. 原子操作(Atomic Operations)
- 说明:原子操作是在一个指令周期内完成的操作,不可分割。
- 作用:在无需显式锁的情况下实现线程安全的数据访问。
- 适用场景:当需要在无需锁的情况下更新共享变量时。
- API:
- POSIX:
__sync_add_and_fetch
: 原子加并取值。__sync_fetch_and_add
: 原子取并加。__sync_val_compare_and_swap
: 原子比较并交换。
- Windows:
_InterlockedIncrement
: 原子增加。_InterlockedDecrement
: 原子减少。_InterlockedCompareExchange
: 原子比较并交换。
- POSIX:
6. 信号量(Semaphores)
- 说明:信号量是一种用于控制多个线程对共享资源访问的同步机制。
- 作用:用于控制线程对共享资源的访问。
- 适用场景:当需要限制同时访问共享资源的线程数量时。
- API:
- POSIX:
sem_t
: 信号量类型。sem_init(sem_t *sem, int pshared, unsigned int value)
: 初始化信号量。sem_wait(sem_t *sem)
: 等待信号量。sem_post(sem_t *sem)
: 释放信号量。sem_destroy(sem_t *sem)
: 销毁信号量。
- Windows:
CreateSemaphore
: 创建信号量对象。WaitForSingleObject
: 等待信号量对象。ReleaseSemaphore
: 释放信号量对象。CloseHandle
: 关闭信号量对象。
- POSIX:
7. 事件(Events)
- 说明:事件是一种用于通知线程状态改变的机制。
- 作用:用于同步线程间的执行。
- 适用场景:当需要通知线程状态改变时。
- API:
- POSIX:
pthread_cond_t
: 条件变量类型,可用于实现事件。
- Windows:
CreateEvent
: 创建事件对象。SetEvent
: 设置事件对象。ResetEvent
: 重置事件对象。WaitForSingleObject
: 等待事件对象。CloseHandle
: 关闭事件对象。
- POSIX:
8. 屏障(Barriers)
- 说明:屏障是一种同步原语,用于确保一组线程在继续之前都到达了一个指定点。
- 作用:确保所有线程都达到一个同步点后再继续执行。
- 适用场景:当需要同步一组线程时。
- API:
- POSIX:
pthread_barrier_t
: 屏障类型。pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *barrierattr, unsigned int count)
: 初始化屏障。pthread_barrier_wait(pthread_barrier_t *barrier)
: 等待屏障。pthread_barrier_destroy(pthread_barrier_t *barrier)
: 销毁屏障。
- POSIX:
9. 线程局部存储(TLS, Thread Local Storage)
- 说明:线程局部存储用于在线程之间隔离数据。
- 作用:为每个线程提供独立的存储空间。
- 适用场景:当需要为每个线程提供独立的数据时。
- API:
- POSIX:
pthread_key_t
: 线程局部键类型。pthread_key_create(pthread_key_t *key, void (*destructor)(void *))
: 创建线程局部键。pthread_setspecific(pthread_key_t key, const void *value)
: 设置线程局部变量的值。pthread_getspecific(pthread_key_t key)
: 获取线程局部变量的值。pthread_key_delete(pthread_key_t key)
: 删除线程局部键。
- Windows:
TlsAlloc
: 分配线程局部索引。TlsSetValue
: 设置线程局部值。TlsGetValue
: 获取线程局部值。TlsFree
: 释放线程局部索引。
- POSIX:
10. 读写锁(Read-Write Locks)
- 说明:读写锁允许多个线程同时读取共享资源,但写操作时独占。
- 作用:允许多个读操作同时进行,但写操作时独占。
- 适用场景:当共享资源的读操作远多于写操作时。
- API:
- POSIX:
pthread_rwlock_t
: 读写锁类型。pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr)
: 初始化读写锁。pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)
: 读锁。pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)
: 写锁。pthread_rwlock_unlock(pthread_rwlock_t *rwlock)
: 解锁。pthread_rwlock_destroy(pthread_rwlock_t *rwlock)
: 销毁读写锁。
- POSIX:
以上机制均提供了线程同步和数据保护的基本手段,选择合适的机制取决于具体的应用场景和性能需求。在实际编程中,通常需要根据具体情况选择最合适的同步机制来优化程序的性能和可维护性。