以下是POSIX 线程库(pthreads)中常用的几类线程安全相关函数,包括互斥锁、条件变量、读写锁和线程安全属性等。
1. 互斥锁 (Mutex)
互斥锁用于在多个线程之间实现互斥访问共享资源。互斥锁的基本操作包括初始化、加锁、解锁和销毁。
pthread_mutex_init: 初始化互斥锁。1int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);mutex: 指向要初始化的互斥锁。attr: 互斥锁的属性,可以为NULL表示默认属性。- 返回值: 成功返回
0,失败返回错误码。
pthread_mutex_lock: 加锁操作,使调用线程获得互斥锁。如果锁已经被其他线程持有,则调用线程会阻塞,直到锁可用。1int pthread_mutex_lock(pthread_mutex_t *mutex);mutex: 指向要锁住的互斥锁。- 返回值: 成功返回
0,失败返回错误码。
pthread_mutex_trylock: 尝试加锁。如果锁不可用(已被其他线程持有),不会阻塞调用线程,而是立即返回。1int pthread_mutex_trylock(pthread_mutex_t *mutex);- 返回值: 成功返回
0,如果锁不可用返回EBUSY。
- 返回值: 成功返回
pthread_mutex_unlock: 解锁操作,释放调用线程持有的互斥锁。1int pthread_mutex_unlock(pthread_mutex_t *mutex);- 返回值: 成功返回
0,失败返回错误码。
- 返回值: 成功返回
pthread_mutex_destroy: 销毁互斥锁,释放其资源。1int pthread_mutex_destroy(pthread_mutex_t *mutex);- 返回值: 成功返回
0,失败返回错误码。
- 返回值: 成功返回
2. 条件变量 (Condition Variable)
条件变量允许线程阻塞,等待某个条件的发生。
pthread_cond_init: 用于初始化一个条件变量。1int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);cond: 要初始化的条件变量的指针。attr: 条件变量的属性,可以为NULL表示使用默认属性。- 返回值: 成功返回
0,失败返回错误码。
pthread_cond_wait: 使调用线程阻塞,等待特定条件的发生。当线程调用此函数时,它会自动释放与之关联的互斥锁,并将线程置于等待条件变量的状态。此函数返回时,调用线程将重新获得互斥锁。1int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);cond: 条件变量指针。mutex: 指向互斥锁的指针,该锁必须在调用pthread_cond_wait之前被锁住。- 返回值: 成功返回
0,失败返回错误码。
pthread_cond_signal: 唤醒等待条件变量的一个线程。1int pthread_cond_signal(pthread_cond_t *cond);cond: 条件变量指针。- 返回值: 成功返回
0,失败返回错误码。
pthread_cond_broadcast: 唤醒等待条件变量的所有线程。1int pthread_cond_broadcast(pthread_cond_t *cond);cond: 条件变量指针。- 返回值: 成功返回
0,失败返回错误码。
pthread_cond_destroy: 销毁条件变量,释放其资源。1int pthread_cond_destroy(pthread_cond_t *cond);cond: 条件变量指针。- 返回值: 成功返回
0,失败返回错误码。
3. 读写锁 (Read-Write Lock)
读写锁允许多个线程同时读取共享数据,但写操作需要独占锁。适用于读多写少的场景。
pthread_rwlock_init: 初始化读写锁。1int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);rwlock: 读写锁指针。attr: 读写锁属性,可以为NULL表示默认属性。- 返回值: 成功返回
0,失败返回错误码。
pthread_rwlock_rdlock: 获取读锁。如果写锁已经被占用,调用线程将被阻塞。1int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);- 返回值: 成功返回
0,失败返回错误码。
- 返回值: 成功返回
pthread_rwlock_wrlock: 获取写锁。如果读锁或写锁已经被占用,调用线程将被阻塞。1int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);- 返回值: 成功返回
0,失败返回错误码。
- 返回值: 成功返回
pthread_rwlock_unlock: 释放读锁或写锁。1int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);- 返回值: 成功返回
0,失败返回错误码。
- 返回值: 成功返回
pthread_rwlock_destroy: 销毁读写锁,释放其资源。1int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);- 返回值: 成功返回
0,失败返回错误码。
- 返回值: 成功返回
4. 信号量 (Semaphore)
信号量提供一种计数机制,用于控制多线程对共享资源的访问。
sem_init: 初始化一个信号量。1int sem_init(sem_t *sem, int pshared, unsigned int value);sem: 信号量指针。pshared: 如果为0,表示信号量用于当前进程的线程间通信;如果为非零,表示用于进程间通信。value: 信号量的初始值。- 返回值: 成功返回
0,失败返回-1。
sem_wait: 减少信号量的值。如果信号量的值为0,调用线程将被阻塞,直到信号量的值大于0。1int sem_wait(sem_t *sem);- 返回值: 成功返回
0,失败返回-1。
- 返回值: 成功返回
sem_post: 增加信号量的值。如果有线程在等待信号量,它将被唤醒。1int sem_post(sem_t *sem);- 返回值: 成功返回
0,失败返回-1。
- 返回值: 成功返回
sem_destroy: 销毁信号量,释放其资源。1int sem_destroy(sem_t *sem);- 返回值: 成功返回
0,失败返回-1。
- 返回值: 成功返回
5. 屏障 (Barrier)
屏障用于使一组线程在到达同步点前保持阻塞,直到所有线程都到达这个点。
pthread_barrier_init: 初始化一个屏障对象。1int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count);barrier: 屏障对象指针。attr: 屏障属性,可以为NULL。count: 要同步的线程数量。- 返回值: 成功返回
0,失败返回错误码。
pthread_barrier_wait: 使调用线程在屏障上等待,直到指定数量的线程都调用了该函数。1int pthread_barrier_wait(pthread_barrier_t *barrier);- 返回值: 所有线程都到达时返回
PTHREAD_BARRIER_SERIAL_THREAD,否则返回0。
- 返回值: 所有线程都到达时返回
pthread_barrier_destroy: 销毁屏障对象。1int pthread_barrier_destroy(pthread_barrier_t *barrier);- 返回值: 成功返回
0,失败返回错误码。
- 返回值: 成功返回
6. 自旋锁 (Spinlock)
自旋锁是另一种类型的锁,适用于持锁时间很短的情况。与互斥锁不同,自旋锁不会引起调用线程休眠,而是不断“自旋”,直到锁可用。
pthread_spin_init: 初始化自旋锁。1int pthread_spin_init(pthread_spinlock_t *lock, int pshared);lock: 自旋锁指针。pshared: 共享标志(0表示仅用于同一进程中的线程)。- 返回值: 成功返回
0,失败返回错误码。
pthread_spin_lock: 获取自旋锁。如果锁不可用,调用线程会忙等待。1int pthread_spin_lock(pthread_spinlock_t *lock);- 返回值: 成功返回
0,失败返回错误码。
- 返回值: 成功返回
pthread_spin_unlock: 释放自旋锁。1int pthread_spin_unlock(pthread_spinlock_t *lock);- 返回值: 成功返回
0,失败返回错误码。
- 返回值: 成功返回
pthread_spin_destroy: 销毁自旋锁,释放其资源。1int pthread_spin_destroy(pthread_spinlock_t *lock);- 返回值: 成功返回
0,失败返回错误码。
- 返回值: 成功返回
最后修改于 2024-09-11 18:57