4912|3

241

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

Helper2416-43——Linux_Programing——POSIX线程基础篇 [复制链接]

本帖最后由 yuanlai2010 于 2014-9-12 08:37 编辑

                        
POSIX线程基础篇
参与Helper2416开发板助学计划心得

使用NPTL线程库实现

线程的定义:
        在一个程序中的多个执行路线就叫做线程,线程是一个进程内的一个控制序列。

        也就是说,进程是由一个或多个线程组成的,线程是程序执行的最小单位。

        
线程与进程的创建过程比较:
        当进程执行fork调用时,将创建出该进程的一个新副本,这个新进程拥有自己的变量和自己的PID,它的时间调度也是独立的,它的执行几乎完全独立于父进程。

        当在进程中创建一个新线程时,新的执行线程将拥有自己的栈(拥有自己的局部变量。),但与它的创建者共享全局变量、文件描述符、信号处理函数和当前目录状态。

可以这样理解:线程其实就是一个特殊的函数,当有多个线程的时候,这些特殊的函数可以同时被CPU执行

线程的优点缺点:
优点:
1:让程序看起来是在同时处理多件事情(多任务)。
        2:线程之间的切换需要操作系统做的工作比进程之间的切换少的多,因此多个线程对资源的需求要远小于多个进程。

缺点:
1:基于线程的程序设计相当复杂,且容易出错。
        2:在单核处理器上并不能体现出线程的优势。

        
线程编程基础:
线程有一套完整的与其有关的函数库调用,它们中的绝大多数函数名都以pthread_开头。为了使用这些函数库调用,我们必须定义宏_REENTRANT,在程序中包含头文件pthread.h,并在编译程序时需要要用选项-lpthread来链接线程库。

编译示例gcc-D_REENTRANT thread0.c -othread -lpthread

#include

int pthread_create(pthread_t *thrad, pthread_attr_t *attr, void*(*start_routine)(void *), void *arg);
void pthread_exit(void *retval);
int pthread_join(pthread_t thread, void **thread_return);

pthread_create
函数原型:int pthread_create(pthread_t *thrad, pthread_attr_t *attr,
                                                void *(*start_routine)(void *), void *arg);
函数功能:创建一个新线程。
函数返回:调用成功返回0,调用失败返回错误代码。
参数说明:
第一个参数*thread,是指向pthread_t类型数据的指针,线程被创建时,这个指针指向的变量中将被写入一个标识符,可以通过此标识符来引用新线程。
第二个参数*attr,用于设置线程的属性,一般不需要设置,通常设置此参数为NULL
第三个参数void*(*start_routine)(void *),即线程将要启动执行的函数,
第四个参数*arg,传递给void*(*start_routine)(void *)的参数。

pthread_exit
函数原型:void pthread_exit(void *retval);
函数功能:终止调用它的线程并返回一个指向某个对象的指针。
参数说明:要返回的对象的指针,返回的值需要通过pthread_join才能得到。
                   注意!绝对不能返回局部变量的指针,因为线程结束后,局部变量就不存在了。

pthread_join
函数原型:int pthread_join(pthread_t thread, void **thread_return);
函数功能:用于等待收集线程的信息。
函数返回:调用成功返回0,调用失败返回错误代码。
参数说明:
第一个参数pthread_tthread,指定将要等待的线程,线程通过pthread_create返回的标识符来指定。
第二个参数void**thread_return,它本身是一个指针,指向另一个指针,而后者指向线程的返回值。

代码实践:
  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>


  5. void *pthread1(void *arg);
  6. void *pthread2(void *arg);

  7. int main()
  8. {
  9.         pthread_t thread_id1,thread_id2;
  10.         void *thread_result1, *thread_result2;
  11.         int res;
  12.         
  13.         res = pthread_create(&thread_id1,NULL,pthread1,NULL);
  14.         if(res){
  15.                 perror("pthread1 is not created ...\n");
  16.                 exit(EXIT_FAILURE);
  17.         }

  18.         res = pthread_create(&thread_id2,NULL,pthread2,NULL);
  19.         if(res){
  20.                 perror("pthread2 is not created ...\n");
  21.                 exit(EXIT_FAILURE);
  22.         }

  23.         res = pthread_join(thread_id1,&thread_result1);
  24.         if(res){
  25.                 perror("pthread1 join failed ...\n");
  26.                 exit(EXIT_FAILURE);
  27.         }

  28.         res = pthread_join(thread_id2,&thread_result2);
  29.         if(res){
  30.                 perror("pthread2 join failed ...\n");
  31.                 exit(EXIT_FAILURE);
  32.         }
  33.         
  34.         printf("the pthread1 return %s\n",(char *)thread_result1);
  35.         printf("the pthread2 return %s\n",(char *)thread_result2);
  36.         return 0;
  37. }


  38. void *pthread1(void *arg)
  39. {
  40.         int i;
  41.         for(i=0;i<10;i++){
  42.                 printf("hello this is pthread1 --> %d\n",i);
  43.                 sleep(1);
  44.         }
  45.         pthread_exit("pthread1 finished ...\n");        
  46. }

  47. void *pthread2(void *arg)
  48. {
  49.         int i;
  50.         for(i=0;i<10;i++){
  51.                 printf("hello this is pthread2 --> %d\n",i);        
  52.                 sleep(1);
  53.         }
  54.         pthread_exit("pthread2 finished ...\n");
  55. }
复制代码

运行结果:
  1. [yuanlai@fedora pthread]$ ls
  2. pthread0_arm  pthread0.c
  3. [yuanlai@fedora pthread]$ gcc -D_REENTRANT pthread0.c -o pthread0 -lpthread
  4. [yuanlai@fedora pthread]$ ls
  5. pthread0  pthread0_arm  pthread0.c
  6. [yuanlai@fedora pthread]$ ./pthread0
  7. hello this is pthread1 --> 0
  8. hello this is pthread2 --> 0
  9. hello this is pthread2 --> 1
  10. hello this is pthread1 --> 1
  11. hello this is pthread2 --> 2
  12. hello this is pthread1 --> 2
  13. hello this is pthread2 --> 3
  14. hello this is pthread1 --> 3
  15. hello this is pthread2 --> 4
  16. hello this is pthread1 --> 4
  17. hello this is pthread2 --> 5
  18. hello this is pthread1 --> 5
  19. hello this is pthread2 --> 6
  20. hello this is pthread1 --> 6
  21. hello this is pthread2 --> 7
  22. hello this is pthread1 --> 7
  23. hello this is pthread2 --> 8
  24. hello this is pthread1 --> 8
  25. hello this is pthread2 --> 9
  26. hello this is pthread1 --> 9
  27. the pthread1 return pthread1 finished ...

  28. the pthread2 return pthread2 finished ...

  29. [yuanlai@fedora pthread]$
复制代码
程序正常运行,会有三个线程,一个主线程,两个子线程,由于没有任何的同步机制,两个子线程的输出结果并没有什么规律。

论坛IDyuanlai2010
发表时间:2014-09-11

最新回复

不错学习了,感谢楼主,加油,努力奋斗,!!   详情 回复 发表于 2024-7-31 21:27
点赞 关注

回复
举报

18

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
不错,学习了~~
 
 

回复

554

帖子

0

TA的资源

版主

板凳
 
非常不错,继续加油,这几在出差了,不能及时回复。。。
 
个人签名My dreams will go on...
http://www.jyxtec.com
 
 

回复

419

帖子

0

TA的资源

纯净的硅(中级)

4
 

不错学习了,感谢楼主,加油,努力奋斗,!!

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表