线程
线程与进程的区别
在linux系统当中,进程与线程的相同点大于不同点,系统并没有为线程定义特殊的数据结构,(所有的线程或进程的核心数据结构都是 task_struct)。唯一的区别就是共享的数据区域不同。
换句话说,线程看起来跟进程没有区别,只是线程的某些数据区域和其父进程是共享的,而子进程是拷贝副本,而不是共享。
所以总结来说就是线程就是数据共享了的进程
线程和进程的区别
1、进程是资源分配最小单位,线程是程序执行的最小单位;
2、线程间的切换效率相比进程间的切换要高
3、进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间,建立数据表来维护代码段、堆栈段和数据段,线程没有独立的地址空间,它使用相同的地址空间共享数据;
4、创建一个线程比进程开销小;
5、线程占用的资源要⽐进程少很多。
6、线程之间通信更方便,同一个进程下,线程共享全局变量,静态变量等数据,进程之间的通信需要以通信的方式(IPC)进行;(但多线程程序处理好同步与互斥是个难点)
7、多进程程序更安全,生命力更强,一个进程死掉不会对另一个进程造成影响(源于有独立的地址空间),多线程程序更不易维护,一个线程死掉,整个进程就死掉了(因为共享地址空间);
8、进程对资源保护要求高,开销大,效率相对较低,线程资源保护要求不高,但开销小,效率高,可频繁切换;
线程的创建
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*routine)(void *), void *arg);
//成功时返回0,失败时返回错误代码
thread是线程ID
attr 线程属性,NULL代表默认属性
routine 线程执行的函数
arg 传递给routine的参数 ,参数是void * ,注意传递参数格式
获取线程ID
如何获取线程ID?有两种方式
1)gettid或者类似gettid()的方法,tid=gettid();
2)直接调用pthread_self(),pid=pthread_self();
gettid 获取的是内核中线程ID,而pthread_self 是posix描述的线程ID。
对于单线程的进程,这两种方式获取的ID都是相同的,对于多线程的进程,这些线程的pid相同,tid不同。
示例如下:
#include<pthread.h> //创建线程的头文件
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h> //进程退出函数的头文件
void *fun(void *);
int main()
{
pthread_t id=pthread_self();
printf("main start\n");
int thread;
if((thread=pthread_create(&id,NULL,fun,NULL))!=0)
{
printf("pthraead_create:failed\n"