POSIX线程—轻量级进程,线程调度是由内核调度程序完成的,线程所消耗的系统资源比较少,相互通讯也比较容易。

多线程的优点:

1.资源消耗量少。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。

2.通信方便。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。

应用多进程的应用程序具有以下优点:

1) 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。
  2) 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
  3) 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

好了,看了多线程的特点后,马上练习一下

需要的头文件:pthread.h

线程标识符:pthread_t       在头文件/usr/include/bits/pthreadtypes.h中定义:

typedef  unsigned long int  pthread_t;

线程函数:

(1)extern int pthread_create __P ((pthread_t *__thread,// 指向线程标识符的指针

__const pthread_attr_t *__attr,// 设置线程属性

                                      void *(*__start_routine) (void *),//线程运行函数的起始地址

void *__arg));// 运行函数的参数

当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。

(2)#include <pthread.h>

extern void pthread_exit __P ((void *__retval)) //函数的返回代码

(3)等待一个线程的结束

oNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt; text-align: left;" align="left">#include <pthread.h>

extern int pthread_join __P ((pthread_t __th, //被等待的线程标识符

void **__thread_return));// 一个用户定义的指针,它可以用来存储被等待线程的返回值

这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。

下面在linux环境下编写 :

[cpp] view plaincopy
  1. /*threadtest.c*/
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <pthread.h>
  5. #include <errno.h>
  6. /*声明线程运行服务程序*/
  7. static void pthread_func_1 (void);
  8. static void pthread_func_2 (void);
  9. int main (void)
  10. {
  11. /*线程的标识符*/
  12. pthread_t pt_1 = 0;
  13. pthread_t pt_2 = 0;
  14. int ret = 0;
  15. /*分别创建线程1、2*/
  16. ret = pthread_create (&pt_1,          //线程标识符指针
  17. NULL,          //默认属性
  18. (void *)pthread_func_1,//运行函数
  19. NULL);         //无参数
  20. if (ret != 0)
  21. {
  22. perror ("pthread_1_create");
  23. }
  24. ret = pthread_create (&pt_2,          //线程标识符指针
  25. NULL,           //默认属性
  26. (void *)pthread_func_2, //运行函数
  27. NULL);          //无参数
  28. if (ret != 0)
  29. {
  30. perror ("pthread_2_create");
  31. }
  32. /*等待线程1、2的结束*/
  33. pthread_join (pt_1, NULL);
  34. pthread_join (pt_2, NULL);
  35. /*主线程退出*/
  36. printf ("main programme exit!/n");
  37. return 0;
  38. }
  39. /*线程1的服务程序*/
  40. static void pthread_func_1 (void)
  41. {
  42. int i = 0;
  43. for (; i < 6; i++)
  44. {
  45. printf ("This is pthread1!/n");
  46. /*i==2时退出,即循环3次*/
  47. if (i == 2)
  48. {
  49. pthread_exit (0);
  50. }
  51. sleep (1);
  52. }
  53. }
  54. /*线程2的服务程序*/
  55. static void pthread_func_2 (void)
  56. {
  57. int i = 0;
  58. for (; i < 3; i++)
  59. {
  60. printf ("This is pthread2!/n");
  61. }
  62. pthread_exit (0);
  63. }

编译:

$ gcc threadtest.c -lpthread -o threadtest

运行:

$ ./threadtest

好,运行结果如下:

This is pthread1!

This is pthread2!

This is pthread2!

This is pthread2!

This is pthread1!

This is pthread1!

main programme exit!

上面例子很清楚地看出各个线程间的运行情况

Linux编程练习 --多线程1--线程创建相关推荐

  1. c语言Linux用线程创建文件,Linux环境下C语言线程创建---简单代码

    在Linux环境下用C语言编写线程创建. //file name: pthreadtext.c #include #include //线程头文件 //pthread不是linux下的默认的库,也就是 ...

  2. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

  3. Linux 多线程开发-线程创建pthread_creat

    1.函数原型 int pthread_creat(pthread_t *pid, const pthread_attr_t *attr,void *(*start_routine)(void *),v ...

  4. java多线程之线程创建和状态

    一.概述 1.上下文切换 即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现 这个机制.时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切 换线 ...

  5. 同软件多个线程设置不同ip_5-13网络编程(附带多线程死锁,线程通信)

    0513多线程 死锁 当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步.这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁 线程通信 生产者消费者模式 模拟街道案例 wai ...

  6. Linux编程练习 --多线程2--属性的设置

    在上一篇的练习里,我们用pthread_create函数创建了一个线程,在这个线程中,我们使用了默认参数,即将该函数的第二个参数设为NULL.的确,对大多数程序来说,使用默认属性就够了,但我们还是有必 ...

  7. Linux编程练习 --多线程5--信号量(semaphore)

    这一篇练习信号量的应用 信号量本质上是一个非负的整数计数器,也是UNIX中古老的实现进程互斥和同步的手段,Linux下信号量概念是在线程中,信号则在进程控制中,不过原理差不多,最基本最经典的操作莫过于 ...

  8. Linux编程练习 --多线程4--条件变量

    上一篇练习了互斥锁的用法和原理,这次学习和互斥锁一起应用的cond--条件变量 1.互斥锁的存在问题: 互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定.设想一种简单情景:多个线程访问同一个共享资源 ...

  9. Linux编程练习 --多线程3--mutex

    互斥指互相排斥的锁,是一种信号量,常用来防止两个进程或线程在同一时刻访问相同的共享资源 1.数据类型: 在Linux下, 线程的互斥量数据类型是pthread_mutex_t,我们定义一个互斥数据可以 ...

最新文章

  1. iOS UICollectionView实现瀑布流(3)
  2. ReentrantLock中的Condition(等待和唤醒)
  3. Extra data: line 1 column 342004 (char 342003)
  4. WPF Geometry 添加Path数据
  5. Caffe官方教程翻译(2):Web demo
  6. 静态注册BroadcastReceiver内部类
  7. [转]cmd 设置环境cmd环境变量命令set 设置永久环境变量命令setx
  8. KB-Modal Dialog Mini FAQ[收藏]
  9. html的动画效果实现无限轮播,利用 CSS3 实现的无缝轮播功能代码
  10. 如何为复杂页面实现过渡页面
  11. Flask模板操作一:基本使用
  12. 寻找二叉树最小叶子节点值
  13. 人之间的尊重是相互的_人与人之间,最长久的关系,不是友情,不是爱情,而是…… ( 好文 )...
  14. eclipse合并svn分支方法
  15. Javascript实现视频文件播放功能
  16. Linux Kubuntu 良心输入法
  17. F28335课后习题记录
  18. springboot配置mysql数据源_SpringBoot+mysql配置两个数据源
  19. C# 让程序开机自动运行的方法
  20. Linux 分区、挂盘

热门文章

  1. 关于fetch api这点事
  2. conda安装特定版本的包
  3. leetcode 203 移除链表元素 C++
  4. 【C语言进阶深度学习记录】十三 C语言中 ++和--操作符
  5. 【软件开发底层知识修炼】二 深入浅出处理器之二 中断的概念与意义
  6. 【C++深度剖析教程34】C++中的强制类型转换dynamic_cast
  7. Flask 路由映射对于双斜线的处理 //a//b
  8. 2018.09.15 vijos1053Easy sssp(最短路)
  9. Java学习之SpringBoot整合SSM Demo
  10. ELF 动态链接 so的动态符号表(.dynsym)