关于mutex 锁

mutex的出现是为了解决优先级反转的问题,由于优先级反转对实时性影响太大,所以mutex 的稳定性直接影响了实时性。纵观目前多种实时操作系统mutex 的设计原理是多多少少有一点问题的,raw os 的mutex 模块成功弥补了其它实时系统在这方面的不足。

raw os 的mutex同时支持优先级置顶和优先级继承的方式来解决优先级反转的问题。

raw os 的mutex比较其它实时系统,比如ucos, ecos, freertos 等占尽了优势,因为当一个任务经历两次以上的优先级提升时,其它系统基本都不支持优先级的逐步还原,那样带来的后果是不能解决优先级反转带来的问题。而且像ucos系统去改变一个优先级被提升之后的任务的优先级的话,整个逻辑都会出错。而且rawos 的mutex 同时支持优先级置顶和优先级反转的策略,增加了用户使用的策略,显得更为灵活强大。

当有一个临界区资源同时存在不同优先级的任务抢占时,推荐使用mutex而不是semaphore, 因为优先级反转的问题对实时性伤害太大。


在 C++ 中,std::mutex 是一种用于线程同步的互斥量。当一个线程正在访问某个共享资源时,可以使用 std::mutex 对这个资源进行加,以确保其他线程在此期间无法访问该资源,从而避免数据竞争的问题。 使用 std::mutex 一般需要以下步骤: 1. 定义一个 std::mutex 对象; 2. 在需要保护的代码块前调用 std::mutex 的 lock() 方法,以住互斥量; 3. 在保护的代码块执行完毕后,调用 std::mutex 的 unlock() 方法,以释放互斥量。 例如,下面是一个简单的示例代码,展示了如何使用 std::mutex 来保护一个共享变量: ```c++ #include <iostream> #include <thread> #include <mutex> std::mutex mtx; int shared_var = 0; void increment_shared_var(int id) { for (int i = 0; i < 100000; ++i) { mtx.lock(); ++shared_var; mtx.unlock(); } } int main() { std::thread t1(increment_shared_var, 1); std::thread t2(increment_shared_var, 2); t1.join(); t2.join(); std::cout << "shared_var = " << shared_var << std::endl; return 0; } ``` 在这个例子中,我们定义了一个全局的 std::mutex 对象 mtx 和一个共享变量 shared_var,然后启动两个线程来分别对 shared_var 进行 100000 次自增操作。在每次自增操作前,我们都使用 mtx.lock() 方法来住互斥量,以确保只有一个线程能够访问共享变量。在自增操作完成后,我们再调用 mtx.unlock() 方法来释放互斥量。 运行这个程序,你会发现最终输出的 shared_var 值为 200000,这说明两个线程对共享变量进行了正确的并发更新,并且互斥量起到了保护作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值