rtx任务间通信--互斥量

void os_mut_init (
    OS_ID mutex );    /* The mutex to initialize */

初始化一个互斥量,互斥量内部计数计为0, mutex类型必须为OS_MUT.在调用互斥量相关函数之前,必须用该函数先初始化互斥量.

OS_RESULT os_mut_wait (
    OS_ID mutex,        /* The mutex to acquire */
    U16   timeout );    /* Length of time to wait */

返回值:
OS_R_OK 获取到互斥量,给互斥量上锁后返回
OS_R_MUT  任务挂起,在超时之前获取到互斥量,给互斥量上锁后返回
OS_R_TMO    等待互斥量超时返回.

该函数用于获取一个互斥量,
1. 如果互斥量没有上锁(计数计为0),将互斥量计数计加1后返回OS_R_OK,
2. 如果互斥量已上锁,调用该函数的任务会挂起(timeout !=0 的情况),
3. 在超时前获取到互斥量,该函数返回OS_R_MUT,超时后返回OS_R_TMO.

互斥量使用优先级继承机制解决优先级反转的问题,如一全局变量G受到互斥量的保护,任务A优先级为1,需要访问该全局变量,所以先占有了互斥量,
在任务A还在访问完全局变量时,切换到了优先级为2的任务B运行,B也想访问全局变量G,于是调用os_mut_wait获取互斥量,但是任务A现在占有互
斥量且优先级比任务B低,这时os_mut_wait将任务A的优先级改为2(任务B的优先级),让任务A先运行,任务A访问完全局变量G,调用os_mut_release
释放互斥量时,会将任务A优先级恢复为1.

参数mutex类型必须为OS_MUT, timeout为超时时间,单位为系统tick, 0和0xffff为特殊值:
timeout=0时,获取不到互斥量会立即返回OS_R_TMO
timeout=0xffff表示无限等待

OS_RESULT os_mut_release (
        OS_ID mutex );    /* The mutex to release */

返回值:
OS_R_OK   互斥量解锁成功
OS_R_NOK  解锁出错: 1. 互斥量内部计数计为0  2. 调用该函数的任务不是互斥量的拥有者(如任务A上锁互斥量,但是任务B去解锁)

如果任务A占有互斥量M,任务A可以继续调用os_mut_wait获取互斥量M,这时os_mut_wait只是简单的将互斥量计数计加1,然后返回。
调用os_mut_release解锁互斥量时,

1.如果互斥量内部计数计>=1,将计数计减1,返回OS_R_OK.
2.互斥量内部计数计为0, 返回OS_R_NOK

时间: 2024-10-29 04:28:46

rtx任务间通信--互斥量的相关文章

rtx任务间通信--信号量

void os_sem_init (    OS_ID semaphore,        /* The semaphore object to initialize */    U16   token_count );    /* Initial number of tokens */ 参数semaphore的类型必须为OS_SEM, token_count为信号计数初始值,调用信号量相关函数之后,必须先通过该函数初始化信号量. OS_RESULT os_sem_send (    OS_ID

linux线程间通信之条件变量和互斥量

一.条件变量定义 有的时候仅仅依靠锁住共享资源来使用它是不够的.有时候共享资源只有某些状态的时候才能够使用.比方说,某个线程如果要从堆栈中读取数据,那么如果栈中没有数据就必须等待数据被压栈.这种情况下的同步使用互斥锁是不够的.另一种同步的方式--条件变量,就可以使用在这种情况下.条件变量(Condition Variable)是线程间的一种同步机制,提供给两个线程协同完成任务的一种方法,使用条件变量可以以原子方式阻塞线程,直到某个特定条件为真为止.条件变量的测试一般是用互斥量来保护的,用来确保每

浅析线程间通信一:互斥量和条件变量

线程同步的目的简单来讲就是保证数据的一致性.在Linux中,常用的线程同步方法有互斥量( mutex ).读写锁和条件变量,合理使用这三种方法可以保证数据的一致性,但值得的注意的是,在设计应用程序时,所有的线程都必须遵守相同的数据访问规则为前提,才能保证这些同步方法有效,如果允许某个线程在没有得到访问权限(比如锁)的情况下访问共享资源,那么其他线程在使用共享资源前都获得了锁,也会出现数据不一致的问题.另外还有自旋锁.barrier和信号量线程同步方法.本文将讨论互斥量和条件变量的使用,并给出了相

线程间通信和线程互斥

线程间通信 1> 线程间通信分为两种 主线程进入子线程(前面的方法都可以) 子线程回到主线程 2> 返回主线程 3> 代码 这个案例的思路是:当我触摸屏幕时,会在子线程加载图片,然后在主线程刷新UI界面 视图布局我就不写了,大家自己来吧,线程间通信代码如下: #pragma mark - 添加响应方法触发创建子线程并加载数据 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

ucos实时操作系统学习笔记——任务间通信(互斥锁)

想讲一下ucos任务间通信中的mutex,感觉其设计挺巧妙,同sem一样使用的是event机制实现的,代码不每一行都分析,因为讲的没邵贝贝老师清楚,主要讲一下mutex的内核是如何实现的.可以理解互斥锁是设置信号量值为1时候的特殊情况,与之不同的地方是互斥锁为了避免优先级反转采用了优先级继承机制,本文主要讲一下互斥锁的创建,pend和post,对应的函数是OSMutexCreate,OSMutexPend,OSMutexPost,当然讲函数也不会所有的扩展功能都讲,只是讲一下主干部分,下面贴出来

【黑马】程序员————多线程(二)单例设计模式、线程间通信,JDK1.5互斥锁

------Java培训.Android培训.iOS培训..Net培训.期待与您交流!----- 一.单例设计模式 单例设计模式的意义: A.保证类在内存中只有一个对象,不提供外部访问方式,构造函数用private修饰. B.提供公共方法(static修饰,类的静态方法),获取类的实例.单例设计模式分为饿汉和懒汉两种模式. 饿汉式&懒汉式 class Test33 { public static void main(String[] args) { Fanjianan.getInstance()

进程间同步(1)&mdash;&mdash;条件变量和互斥量

1. 概述 条件变量和互斥量是最基本的同步形式,总是用于同步同一个进程的各个线程间同步. 当把条件变量或互斥量放在共享内存区时,可用于进程间同步. 同样的情况还有读写锁,它们都是随进程的持续性.   2.互斥锁 互斥锁指代相互排斥,用于保护临界区.多个线程和多个进程分享的共享数据. 静态初始化:static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 动态初始化:互斥锁是动态分配的,pthread_mutex_init(&mutex);初始

线程间的同步----利用互斥量来实现

#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <pthread.h> // 包含线程库 #include <semaphore.h> // 包含信号量库 void *thread_function(void *arg); // 定义线程函数原型 pthread_mutex_t work_mutex; //

【转】VC 线程间通信的三种方式

原文网址:http://my.oschina.net/laopiao/blog/94728 1.使用全局变量(窗体不适用)      实现线程间通信的方法有很多,常用的主要是通过全局变量.自定义消息和事件对象等来实现的.其中又以对全局变量的使用最为简洁.该方法将全局变量作为线程监视的对象,并通过在主线程对此变量值的改变而实现对子线程的控制.      由于这里的全局变量需要在使用它的线程之外对其值进行改变,这就需要通过volatile关键字对此变量进行说明.使用全局变量进行线程通信的方法非常简单