线程间同步

互斥量

void th1_entry(void *parameter)
{
     while(1)
     {
         rt_mutex_take(mutex1_ptr, RT_WAITING_FOREVER);
             flag1++;
             rt_thread_mdelay(1000);  
             flag2++;              
         rt_mutex_release(mutex1_ptr);
     }
}

void th2_entry(void *parameter)
{     
       while(1)
       {
           rt_mutex_take(mutex1_ptr, RT_WAITING_FOREVER);
                flag1++;
                flag2++;
           rt_mutex_release(mutex1_ptr);
           rt_kprintf("flag1:%d, flag2:%d\n",flag1,flag2);
           rt_thread_mdelay(1000);
       }         

}

添加互斥锁能够保证输出打印结果时候 flag1 与flag2 的数值相同

事件集

一个事件集对象可同时等待接受32个事件 ,并且通过 逻辑与逻辑或来选择如何激活线程 。

  • 逻辑与: 假如你设置了4个事件 , 那么这四个事件都触发才可以。
  • 逻辑或: 则表示只需要任意一个便可以
#define EVENT_FLAG_1 (0x1 <<0)
#define EVENT_FLAG_2 (0x1 <<1)
#define EVENT_FLAG_3 (0x1 <<2)

void th1_entry(void *parameter)
{

    while(1)
    {   rt_event_recv(event1_ptr, EVENT_FLAG_1, RT_EVENT_FLAG_CLEAR|RT_EVENT_FLAG_AND, RT_WAITING_FOREVER, NULL);
            rt_kprintf("th1 is running\n");
        rt_event_send(event1_ptr,EVENT_FLAG_2 );
        rt_thread_mdelay(1000);
    }
}

void th2_entry(void *parameter)
{
    while(1)
    {   rt_event_recv(event1_ptr, EVENT_FLAG_2, RT_EVENT_FLAG_CLEAR|RT_EVENT_FLAG_AND, RT_WAITING_FOREVER, NULL);
            rt_kprintf("th2 is running\n");
        rt_event_send(event1_ptr,EVENT_FLAG_3 );
        rt_thread_mdelay(1000);
    }

}
void th3_entry(void *parameter)
{
    while(1)
    {   rt_event_recv(event1_ptr, EVENT_FLAG_3, RT_EVENT_FLAG_CLEAR|RT_EVENT_FLAG_AND, RT_WAITING_FOREVER, NULL);
            rt_kprintf("th3 is running\n");
        rt_event_send(event1_ptr,EVENT_FLAG_1 );
        rt_thread_mdelay(1000);
    }

}


int main(void)
{  
    ...
    //首先发送事件1  这样才能够进入线程1 触发线程2  进而触发线程3
    rt_event_send(event1_ptr, EVENT_FLAG_1); 
  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值