RT_thread 学习笔记 3线程同步:事件集机制实战解析


事件集(Event) 
事件集可以看作公交⻋站的场景。线程可以等待多个事件发⽣,⽐如等待公交⻋或等待同伴到
达。如果满⾜某个或某⼏个条件,线程将被唤醒继续执⾏。
事件集的⼯作机制 
事件集⽤于线程间的同步,可以让线程等待⼀个或多个事件的触发:
逻辑与(AND):线程等待多个事件同时发⽣才被唤醒。
逻辑或(OR):线程只需等待其中⼀个事件发⽣即可被唤醒。
RT_IPC_FLAG_PRIO
 表⽰优先级等待,
RT_IPC_FLAG_FIFO
 表⽰先进先出等待。
==api:
rt_event_create:⽤于动态创建事件对象。
rt_event_init:⽤于静态初始化事件对象。
rt_event_delete:⽤于删除动态事件对象。
rt_event_detach:⽤于卸载静态初始化的事件对象。
rt_event_send:发送事件,触发指定的事件标志位。
rt_event_recv:接收事件,线程根据等待条件阻塞,直到指定事件发⽣


```
rt_event_t event = RT_NULL;
// 运动员线程:等待两个裁判信号
void athlete_entry(void *parameter)
{
    rt_uint32_t received;
    rt_kprintf("运动员: 等待裁判的准备信号和开始信号\n");
    // 等待两个事件:准备信号(位1)
    // 和开始信号(位2)
    rt_event_recv(event, (1<<1 | 1<<2), RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &received);
    // 两个事件都收到,运动员起跑
    rt_kprintf("运动员: 收到准备信号和开始信号,准备起跑!\n");
}
// 裁判1线程:发送准备信号
void referee1_entry(void *parameter)
{
    rt_thread_mdelay(500);
    // 模拟准备时间
    rt_kprintf("裁判1: 发送准备信号\n");
    rt_event_send(event, (1<<1));
    // 发送准备信号事件(位1)

    rt_thread_mdelay(1);
}
// 裁判2线程:发送开始信号
void referee2_entry(void *parameter)
{
    rt_thread_mdelay(100);
    // 模拟准备时间
    rt_kprintf("裁判2: 发送开始信号\n");
    rt_event_send(event, (1<<2));
    // 发送开始信号事件(位2)
    rt_thread_mdelay(1);
}
int main(void)
{
    // 初始化事件对象
    event = rt_event_create("event", RT_IPC_FLAG_PRIO);
    // 创建运动员线程
    rt_thread_t athlete_tid = rt_thread_create("athlete", athlete_entry,
                                               RT_NULL, 1024, 25, 10);
    //  创建裁判1线程
    rt_thread_t referee1_tid = rt_thread_create("referee1", referee1_entry,
                                                RT_NULL, 1024, 25, 10);
    // 创建裁判2线程
    rt_thread_t referee2_tid = rt_thread_create("referee2", referee2_entry,
                                                RT_NULL, 1024, 25, 10);
    // 启动线程
    rt_thread_startup(athlete_tid);
    rt_thread_startup(referee1_tid);
    rt_thread_startup(referee2_tid);
    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值