[RT-Thread]互斥锁(mutex)

[RT-Thread]互斥锁(mutex),第1张

和 semaphore 一样, mutex 在RTT中也归类为 ipc ( ipc 应该是进程间通信,感觉命名是不是有点不贴切)。

mutex 用于资源互斥的场景,比如多个线程可能同时访问(R/W)同一个全局变量,这个时候,就需要加锁控制。

仍然主要关注 mutex控制块 、 take 和 release *** 作。

parent :

和其它 ipc 方式相同,主要是维护 suspend_thread 。

value :

value其实就两个值:0或者1,1表示已被持有,0表示空闲状态。

original_priority :

保存持有该mutex的thread的本来的线程优先级,便于优先级继承后,恢复原本线程优先级。

hold :

hold 记录被同一thread请求的次数,嵌套场景。

owner :

持有该mutex的thread。

事件(event)与互斥量(mutex)区别

事件(event)

事件是用来同步地位不相等的线程的,事件可以用来使一个线程完成一件事情,然后另外的线程完成剩下的事情。事件的使用很灵活,自动事件的激发态是由人工来控制的,而Mutex在释放(releaseMetux)后就一直处于激发态,直到线程WaitForSingleObject。事件可以用来控制经典的读写模型和生产者和消费者模型。相应的方式为,生成者等待消费者的消费,再消费者消费完后通知生产者进行生产。

互斥量(Mutex)

Mutex是排他的占有资源,一般用于地位相等的线程进行同步,每个线程都可以排他的访问一个资源或代码段,不存在哪个线程对资源访问存在优先次序。一个线程只能在Mutex处于激发态的时候访问被保护的资源或代码段,线程可以通过WaitForSingelObject来等待Mutex,在访问资源完成之后,ReleaseMutex释放Mutex,此时Mutex处于激发态。Mutex具有成功等待的副作用,在等待到Mutex后,Mutex自动变为未激发态,直到调用ReleaseMutex使Mutex变为激发态为止。自动事件也具有成功等待的副作用。手动事件没有,必须ResetEvent使手动事件变为未激发态。进程和线程也没有成功等待的副作用。当线程或者进程函数返回时,线程内核对象变为激发态,但WaitForSingleObject并没有使线程或者进程的内核对象变为未激发态。

总之,事件一般用于控制线程的先后顺序,而Mutex一般用于排他的访问资源。

互斥锁:体现的是一种竞争,我离开了,通知你进来。用于防止资源读写竞争关系。

条件锁:体现的是一种协作,我准备好了,通知你开始吧,一般用于线程同步,只共同完成一个任务。

In Thread1:

In Thread2:

为什么要与pthread_mutex 一起使用呢? 这是为了应对 线程1在调用pthread_cond_wait()但线程1还没有进入wait cond的状态的时候,此时线程2调用了 cond_singal 的情况。 如果不用mutex锁的话,这个cond_singal就丢失了。加了锁的情况是,线程2必须等到 mutex 被释放(也就是 pthread_cod_wait() 释放锁并进入wait_cond状态 ,此时线程2上锁) 的时候才能调用cond_singal

参考资料:

>

以上就是关于[RT-Thread]互斥锁(mutex)全部的内容,包括:[RT-Thread]互斥锁(mutex)、windows 互斥量和事件的区别、条件锁和互斥锁等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/10212205.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存