Linux学习笔记(16)-多线程
什么是多线程?或者说,什么是线程?
按照书本上的描述,所谓线程,便是包含在进程内部的顺序执行流,是进程中实际运作的单位,也是操作系统能够进行调度的最小单位。
一个进程中可以并发多条线程,每条线程并行执行不同的任务。
在以往的单片机裸机编程中,程序的执行永远都有一个确定的路径,从开始到结束,完全是在我们的控制下……
按照我自己的话来讲,一个线程就是一个能够独立运行的程序。三条线程就是三个独立运行的程序,在宏观上来看,相当于用一个CPU做了三个CPU的工作。
……
线程与进程的关系:
1.一个线程只能属于一个进程,而一个进程可以拥有多个线程,但必然有且只有一个住线程
2.操作系统将资源分配给进程,一个进程中的所有线程共享进程中的资源
3.线程不拥有资源,它是作为调度和运行的基本单位,进程作为拥有资源的基本单位
为什么不用进程代替线程?
1.进程作为拥有资源的基本单位,系统在创建活撤销进程的时候,都会耗费很大的开销,而线程的开销则要小得多。
2.进程间通信很费劲,而线程由于资源共享,通信极为简单
3.执行效率更高
——————————————————————————————————————————————————————————————
创建线程
在进程中创建一个线程的函数是pthread_create()
原形:int pthread_create(pthread_t * thread, const pthread_attr * attr, void *(start_routine)(void *), void *arg)
说明:如果线程创建成功,函数返回0,并将会立即执行。如果创建失败,函数返回一个非0的数
参数:
thread 用来指向创建新线程的ID
attr用来设置线程的基本属性,如果是NULL,那么线程就使用默认属性
start_routine是线程开始时所执行的函数,第四个参数arg就是他的参数
线程终止
终止一个线程可以使用函数pthread_exit()
原形:pthread_exit(void * retval)
参数是一个无类型的指针,可以将线程的返回值当做函数pthread_exit()的参数传入
实战演练!!
创建五个线程,分别打印出自己的线程ID
代码如下:
重点:在编译线程相关的代码时,要在编译选项中加上-pthread
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h> #define NUM_PTHREAD 5 void *fun(void *pthreadid)
{
int id; id=(int)pthreadid;
printf("线程ID为:%d.\n",id);
pthread_exit(NULL);
} int main(void)
{
pthread_t th[NUM_PTHREAD];
int ret,i; printf("进入主线程.\n");
for(i=;i<NUM_PTHREAD;i++)
{
printf("创建线程%d.\n",i);
ret = pthread_create(&th[i],NULL,fun,(void *)i);
if (ret != )
{
printf("线程%d创建失败.errno=%d.\n",i,errno);
return -;
}
}
printf("主线程退出!\n");
pthread_exit(NULL);
return ;
}
编译之后,执行结果如下:
注意:由于操作系统调度的线程随机性,执行结果可能与我的现象不一致!
Linux学习笔记(16)-多线程的更多相关文章
- Linux学习笔记16——wait函数
wait函数的定义如下: #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *stat_loc); wai ...
- Linux 学习笔记
Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...
- linux学习笔记2 - linux常用命令
转载请标注原链接:http://www.cnblogs.com/xczyd/p/5543731.html 第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装lin ...
- Linux 学习笔记之超详细基础linux命令(the end)
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 14---------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 14
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 13---------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 13
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 12---------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 9
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 8----------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 7
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 6----------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 1
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 说明:主要是在REHL Server 6操作系统下进行的测试 --字符界面虚拟终端与图形界面之间的切 方法:[ ...
- 20155303狄惟佳预备作业三Linux学习笔记
20155303狄惟佳预备作业三Linux学习笔记 初次接触Ubuntu系统以及Linux内核,了解了其产生的历史,从感性来讲,深深吸引我的是其中蕴含的珍贵的开源精神,以及Stallman等人对&qu ...
随机推荐
- style,currentStyle,getComputedStyle的区别和用法
先说说层叠样式表的三种形式(三种的叫法不一,按照各自的习惯): 一.内联样式:在HTML标签用style属性设置.如: 1 <p >这是内联样式</p> 二.嵌入样式:通过&l ...
- touch
Linux touch 命令 在 Linux 下运用 touch 命令创建一个空文件.当然我们也可以使用其他命令例如 vi, nano 或是任意一个编辑工具来实现.但是你可能需要更多的步骤来完成操 ...
- __run_timers() -- 处理全部超时定时器
__run_timers() -- 处理全部超时定时器 run_timer_softirq() --> __run_timers() /usr/src/linux-/kernel/timer.c ...
- VB编程的键盘控制
在VB中,很多控件都提供了键盘输入功能(如文本框.组合框等),但它们对键盘的处理较简单,遇到复杂一点的要求即无能为力. 因而VB提供了KeyPress.KeyUp.KeyDown三种键盘事件,当用户按 ...
- MySQL索引类型总结和使用技巧以及注意事项
索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable ...
- Dijkstra 算法
all the nodes should be carectorized into three groups: (visited, front, unknown) we should pay spec ...
- my97中文乱码问题
在使用my97日期插件后页面显示中文乱码问题: 解决方法: 把下面这段代码复盖到你的ZH-CN.js就解决了 var $lang={ errAlertMsg: "\u4E0D\u5408\u ...
- 掌握 tar 命令让你秒变大牛
导读 相信很多初学者在linux环境下为文件归类整理而犯愁,下面是整理文章的的一些命令与技巧,学习Tar命令将会让你处理文件时更加得心应手. Tar(Tape ARchive,磁带归档的缩写:最初设计 ...
- idea开发工具破解地址
链接失效可以使用激活码.激活码不需要联网也可以开发. idea 在注册时选择 License server ,填http://idea.iteblog.com/key.php ,然后点击激活. 激活码 ...
- python3 黑板客爬虫闯关游戏(三)
第三关,先登录,再猜密码,这关难度较第二关大幅增加,要先去注册一个登录账号,然后打开F12,多登录几次,观察headers数据的变化 给出代码,里面注释很详细 import urllib.reques ...