[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;
- }
- /*@}*/
#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
share_var = 0 share_var = 100001

浙公网安备 33010602011771号