zoukankan      html  css  js  c++  java
  • [RTT例程练习] 2.1 问题引入 线程抢占导致的临界区问题

    这一小节是只是一个演示问题的实验。

    在编程中,时常会碰到全局变量,程序在不同的地方都可以对全局变量进行修改,引起很大的麻烦。在RTOS中,尤其如此。因为不同的线程都有可能修改一个全局变量,而修改的顺序确实由调度决定的,不能通过人力决定。

    当然,这个问题不是只限于全局变量。例如两个线程都可以通过串口向终端打印信息。如果没有一种控制机制,两个线程打印的信息就会交织在一起。

    下面这段程序只是演示了这个现象。两个线程同时对一个变量+1。

    程序

    #include <rtthread.h>
    
    static rt_uint32_t share_var;
    
    static char thread1_stack[1024];
    struct rt_thread thread1;
    static void rt_thread_entry1(void *parameter)
    {
        rt_uint32_t i;
        share_var = 0;
        rt_kprintf("share_var = %d\n", share_var);
        rt_thread_delay(1000);
        for (i = 0; i < 10000; i++)
        {
            share_var++; 
        }
        rt_kprintf("\t share_var = %d\n", share_var);
        rt_kprintf("\t share_var = %d\n", share_var);
    }
    
    static char thread2_stack[1024];
    struct rt_thread thread2;
    static void rt_thread_entry2(void *parameter)
    {
        //rt_thread_delay(1);
        share_var++;
    }
    
    int rt_application_init()
    {
        rt_err_t result;
        
        result =  rt_thread_init(&thread1,
            "thread1",
            rt_thread_entry1, RT_NULL,
            &thread1_stack[0], sizeof(thread1_stack),
            5, 5);
        if (result == RT_EOK)
            rt_thread_startup(&thread1);
            
        result = rt_thread_init(&thread2,
            "thread2",
            rt_thread_entry2, RT_NULL,
            &thread2_stack[0], sizeof(thread2_stack),
            5, 5);
        if (result == RT_EOK)
            rt_thread_startup(&thread2);
    
        return 0;
    }
    
    /*@}*/  

    输出结果:

    share_var = 0
    share_var = 100001


                    

  • 相关阅读:
    第五章 Python——字符编码与文件处理
    第六章 Python——函数与面向过程编程
    第七章 Python——模块与包
    第一章 计算机硬件基础与操作系统介绍
    luogu P1706 全排列问题
    luogu 2142 高精度减法
    luogu P1601 高精度加法
    luogu P1803 线段覆盖 贪心
    luogu P1031 均分纸牌 贪心
    luogu P2678 跳石头 二分答案
  • 原文地址:https://www.cnblogs.com/lyyyuna/p/4123945.html
Copyright © 2011-2022 走看看