当前位置: 首页 > news >正文

初探线程——pthread_create

  上一篇博客演示了一个最简单的进程的创建过程,这篇博客来演示一个最基础的线程的例子。corecible回复我上篇博文时说:“不过真正的项目开发中,开子进 程用的很少。大多都是线程。”其实也说得挺有道理的,因为像java这样的语言中,原生就支持线程,并提供了一套完整的通信的方案。在linux中,线程实际上就是一个轻量级的进程,因为他们都是通过调用do_fork()函数,传入不同的参数实现的。本来想先写篇关于fork()实现分析的文章,后来考虑到线程和进程在linxu实现中的相同点,所以就先写这篇博文了。

  首先看个最基础的线程的实现:

 1  #include < stdio.h >
 2  #include < pthread.h >
 3 
 4 
 5  void   * print_thread_id( void   * arg)
 6  {
 7           /*  打印当前线程的线程号 */
 8          printf( " Current thread id is %u\n " , (unsigned)pthread_self());
 9  }
10 
11  int  main( int  argc,  char   * argv[])
12  {
13          pthread_t thread;                /* 保存线程号 */
14 
15           /* 创建一个线程   */
16          pthread_create( & thread, NULL, print_thread_id, NULL);
17 
18          sleep( 1 );                          /* 休眠1s */
19 
20           /* 打印进程号     */
21          printf( " Main thread id is %u\n " , (unsigned)pthread_self());
22 
23           return   0 ;
24  }
25 


   编译的时候,一定要加上-lpthread选项,不然会报错:undefined reference to `pthread_create'。

  下面来看看pthread_create的声明:

  #include<pthread.h>

  int pthread_create(pthread_t *thread, pthread_addr_t *arr,

           void* (*start_routine)(void *), void *arg);

 

  •  thread   :用于返回创建的线程的ID
  • arr       : 用于指定的被创建的线程的属性,上面的函数中使用NULL,表示使用默认的属性
  • start_routine   : 这是一个函数指针,指向线程被创建后要调用的函数
  • arg      : 用于给线程传递参数,在本例中没有传递参数,所以使用了NULL

 

   线程相对进程来说,有几大优点,一是其切换速度快,其保存现场花费的时间比进程少得多,二是:线程间的同步比进程简单(至少我是这样认为的)。当然,可能还有很多其他的优点我没有发现,还请您多多指教。

转载于:https://www.cnblogs.com/huangwei/archive/2010/05/19/1739593.html

相关文章:

  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • DansGuardian
  • 【转】ie6.0下div 不能实现1px 高度的几种解决方法
  • 在.Net平台开发Wap的一些记录
  • 未能为 SSL/TLS 安全通道建立信任的解决办法
  • squid + dansguardian + iptable 实现网页过滤
  • 虚拟光驱文件bin/cue到iso的转换
  • 纯八卦一下。。。。。Orx的名字来源于一个沼泽。。。。
  • IE8 兼容视图 IE7 解决办法
  • SIGHUP信号与控制终端
  • IT技术的三个层次
  • Ruby connect to SQL server native client
  • Nmap使用方法
  • 系统蓝屏重起:如何修改设置,记录系统蓝屏重起的错误
  • Asp.Net应用程序配置Web.config
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 2019年如何成为全栈工程师?
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript服务器推送技术之 WebSocket
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • JavaScript设计模式之工厂模式
  • js ES6 求数组的交集,并集,还有差集
  • Mac转Windows的拯救指南
  • MQ框架的比较
  • Python 基础起步 (十) 什么叫函数?
  • Ruby 2.x 源代码分析:扩展 概述
  • SegmentFault 2015 Top Rank
  • Vue UI框架库开发介绍
  • vue-router 实现分析
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 分布式事物理论与实践
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 那些年我们用过的显示性能指标
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何使用 JavaScript 解析 URL
  • 设计模式(12)迭代器模式(讲解+应用)
  • 世界上最简单的无等待算法(getAndIncrement)
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 异步
  • 优秀架构师必须掌握的架构思维
  • 追踪解析 FutureTask 源码
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (1)(1.13) SiK无线电高级配置(五)
  • (a /b)*c的值
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Git) gitignore基础使用
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (六)Hibernate的二级缓存
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转)jdk与jre的区别
  • (转)VC++中ondraw在什么时候调用的
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET Core 中插件式开发实现