utopiaprince 发表于 2011-3-22 11:01:32

关于RT-Threads线程建立的疑惑

在RT-Threads编程指南中关于线程建立的例子中:
/*
* 程序清单:动态线程
*
* 这个程序会初始化2个动态线程,它们拥有共同的入口函数,但参数不相同
*/
.....................
int thread_dynamic_simple_init()
{
    rt_thread_t thread1;
    rt_thread_t thread2;

    thread1 = rt_thread_create("thread",
                              thread_entry, RT_NULL,
                              512,
                              20, 5);
    if (thread1 != RT_NULL)
      rt_thread_startup(thread1);


    thread2 = rt_thread_create("thread",
                              thread_entry, RT_NULL,
                              512,
                              20, 5);
    if (thread1 != RT_NULL)
      rt_thread_startup(thread2);
........
}
手册里面提到这是2个不同的线程,但是是如何区分的呢?他们的所有参数都是一样的呀,很疑惑,望指点下

ffxz 发表于 2011-3-22 12:01:48

这个估计是比较早期的文档,这个代码,你可以看svn上最新的:
http://rt-thread.googlecode.com/svn/trunk/examples/kernel/thread_dynamic_simple.c

其中不同的:
int thread_dynamic_simple_init()
{
    /* 创建线程1 */
    tid1 = rt_thread_create("t1",
      thread_entry, (void*)1, /* 线程入口是thread_entry, 入口参数是1 */
      THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
    if (tid1 != RT_NULL)
      rt_thread_startup(tid1);
    else
      tc_stat(TC_STAT_END | TC_STAT_FAILED);

    /* 创建线程2 */
    tid2 = rt_thread_create("t2",
      thread_entry, (void*)2, /* 线程入口是thread_entry, 入口参数是2 */
      THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
    if (tid2 != RT_NULL)
      rt_thread_startup(tid2);
    else
      tc_stat(TC_STAT_END | TC_STAT_FAILED);

    return 0;
}

即,它们的入口参数是不同的。但是最关键的是,rt_thread_create会动态创建一个线程控制块和栈,这两个线程的是完全不同的物理内存地址。

utopiaprince 发表于 2011-3-22 12:57:09

感谢ffxx的分析,我又仔细的看了一下函数跳转。
我理解的是就算这些参数都是一样的,但是rt_thread_create生成的线程控制块的地址是不一样的。他们只是2个外表看似“一样”的线程。
当然如果采用了不一样的字符串能分辨出是2个不一样的线程,用不一样的函数入口参数能够实现不一样的功能效果。
不知道我这样理解对不对?
页: [1]
查看完整版本: 关于RT-Threads线程建立的疑惑