进程间同步——互斥锁与条件变量

本文详细介绍了线程同步中的互斥锁与条件变量的概念及使用方法。包括它们的API调用、初始化方式以及如何通过这些机制来实现对共享资源的安全访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<pthread.h>

互斥锁——用于主动获取共享资源时的互斥与等待

  • 多个线程锁定同一临界区时,解锁后,优先级最高的线程被优先执行

  • 静态初始化

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

  • API

int pthread_mutexattr_init(pthread_mutexattr_t*);

int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int);
PTHREAD_PROCESS_SHARED/PTHREAD_PROCESS_PRIVATE
在<uinstd.h>中定义了_POSIX_THREAD_PROCESS_SHARED时才能指定进程间共享属性
int pthread_mutexattr_getpshared(pthread_mutexattr_t*, int);
int pthread_mutexattr_destroy(pthread_mutexattr_t*);

int pthread_mutex_init(pthread_mutex_t* , pthread_mutexattr_t*);

int pthread_mutex_lock(pthread_mutex_t*);

int pthread_mutex_trylock(pthread_mutex_t*);

int pthread_mutex_unlock(pthread_mutex_t*);

int pthread_mutex_destroy(pthread_mutex_t*);


条件变量——用于获取共享资源时受到被动的提醒


  • 静态初始化

static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

  • API

int pthread_condattr_init(pthread_mutexattr_t*);

int pthread_condattr_setpshared(pthread_condattr_t*, int);
int pthread_condattr_getpshared(pthread_condattr_t*, int);
int pthread_condattr_destroy(pthread_mutexattr_t*);


int pthread_cond_init(pthread_cond_t * );

int pthread_cond_wait(pthread_cond_t *,pthread_mutex_t* );

int pthread_cond_timedwait(pthread_cond_t *,pthread_mutex_t* , const struct timespec *abstime);

此处采用绝对时间,好处是,若因为捕获到信号而提前解阻塞,再次进入阻塞态时无须修改时间参数

int pthread_cond_signal(pthread_cond_t *);

int pthread_cond_broadcast(pthread_cond_t *);

int pthread_cond_destroy(pthread_cond_t *);

  • 调用例程

pthread_mutex_lock(mutex4test); //保护对测试变量的读取

while(test) //测试变量

pthread_cond_wait(condmutex4test ); //解锁对测试变量的保护并阻塞等待 解阻塞后继续锁定测试变量

pthread_mutex_unlock(mutex4test); //解除对测试变量的保护


### MySQL 中条件变量互斥锁使用场景差异 #### 互斥锁 (Mutex Lock) 互斥锁主要用于保护共享资源免受并发访问的影响,确保同一间只有一个线程能够访问特定资源。这有助于维护数据的一致性安全性。 在 MySQL 中,当执行某些操作会自动获取互斥锁以防止其他进程干扰。例如,在对表进行修改,MySQL 会对该表施排他锁,阻止其他任何尝试更改此表的操作直到当前事务结束[^2]。 对于编程接口而言,通常情况下开发者无需手动管理这些低级别的锁;然而,在编写存储过程或触发器可能会涉及到显式的锁定逻辑。 ```sql -- 获取全局读锁, 阻止所有写入操作 FLUSH TABLES WITH READ LOCK; ``` #### 条件变量 (Condition Variable) 条件变量允许一个或多个线程等待某个特定事件的发生。它常互斥锁配合使用——获得互斥锁再检查条件是否满足,如果不满足则调用 `wait()` 方法使当前线程进入休眠状态直至另一线程通知唤醒并重新评估条件。 在 MySQL 内部实现中,条件变量用于协调各个工作线程之间的协作关系,特别是在复杂的查询优化过程中起到重要作用。不过值得注意的是,应用程序层面很少直接接触到这类高级同步原语,更多是在数据库管理系统内部由 C/C++ 编写的源码里见到它们的身影[^4]。 #### 使用场景对比 | 特性 | 互斥锁 | 条件变量 | |--|--------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------| | **主要用途** | 控制对临界区(Critical Section)内资源的独占使用权 | 协助线程间通信,让某一线程暂停执行直到发生指定情况 | | **作用范围** | 局限于保护一小段代码块中的关键数据 | 跨越更广泛的上下文环境,可用于跨函数甚至模块间的信号传递 | | **典型应用场景** | 修改数据库元数据、更新索引结构 | 实现生产者消费者模式下的缓冲池满/空检测 | #### 差异总结 - **功能定位**: 互斥锁侧重于解决竞争条件下如何安全地访问公共资源的问题;而条件变量则是为了更好地支持多线程程序内的有序交互。 - **组合运用**: 很多候两者是相辅相成的关系,比如在一个典型的生产消费模型里面,除了要用到队列两端各自的互斥锁外,还需要借助条件变量来告知对方何可以继续前进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值