Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4263150
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: C/C++

2011-05-14 16:32:03

说明:
    这是我自己关于 *hello() 与 hello()的一点理解,也知道这么理解对不对,希望指教


接着上篇 中:创建一个线程 pthread_create


在 pthread_create 的第三个参数,是这么定义的:
    void *(* _start_routine) (void *)


1. 在第一个程序中,我们定义 子线程运行 函数地址
   void
*hello(struct message *str)
   在 pthread_create中调用方式为:
   pthread_create(&thread_id, NULL,
(void *)*hello, &test);
或者是
    void *a;
    a=*hello;
    pthread_create(&thread_id,NULL,(void *)a,&test);
      

2. 在第二个程序中,我们定义 子线程运行 函数
   void
thread(void)
   在 pthread_create 中调用方式为:
 ret=pthread_create(&id,NULL,
(void *) thread,NULL);
    thread 本身就是表示 函数的地址了
    (void *) thread 还是转换为地址



1. 首先我们要明确什么是代码段??

代码段:
    代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。代码段是存放了程序代码的数据,假如机器 中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段


     代码段 存放代码(如:函数) 和部分整数常量,text段是可以执行的


2. void thread()说明

    我们知道,函数是存放在 text 代码段中的,如下,我们将thread 函数放在 text 代码段中。 
    假设,我们thread代码放在内存地址从 2 ~5 之间的内存中。
    就像 数组一样,数组名就是表示数组的地址,是一个指针,同样的,函数名 也就是表示 这些个内存代码的首地址了,所以,thread 就是 这个代码的首地址

     而在 pthread_create 中,定义的    void *(* _start_routine) (void *)
比较上面定义的,我们
  void *(thread)  这样就是对的了


3. void *hello()说明

      1. 说明 pthread_create(&thread_id, NULL, (void *)*hello, &test);

     我们知道,函数存放在 text 段中,我们假设放在 内存为 2~4 之间,
而这里是 void * ,是一个 返回值为空类型的指针 , 是不是在运行的时候放在 栈中的呢 ??我认为是在程序运行时,放在栈中,假设就放在 从111~114 之间,地址占 4 个字节。

    那么在 栈中的 本身地址是多少呢???
    我们假设为了 111,在程序测试中 为 0x80484a4~
0x80484a8
    hello 就是 stack 栈中 的内存地址
  1. printf("adr void *hello() is %p\n",hello);
  1. ywx@yuweixian:~/yu/professional/4$ ./pthread_create ;./pthread_create
  2. stack :adr void *hello() is 0x80484a4
    那么我们怎么样获得 text 代码段中 函数的地址呢 ??
    因为在 111 这个stack 栈内存地中,存放的内容 就是 text 代码段 hello 的代码内存地址  2

    *hello  就可以获得 地址了

   所以说
pthread_create(&thread_id, NULL, (void *)*hello, &test)

(void *)*hello  就正确了




 
     2. 说明  void *a;
               a=*hello;
               pthread_create(&thread_id,NULL,(void *)a,&test);


     在 main 函数中, void *a,存放在 stack 中,

                  



阅读(794) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~