71-Linux_线程

线程

  • 一.进程和线程
  • 二.进程和线程的区别
  • 三.线程的实现
  • 四.线程的接口
    • 1.pthread_create
    • 2.pthread_join
    • 3.pthread_exit
  • 五.例题

一.进程和线程

71-Linux_线程_第1张图片
进程是一个动态的概念,就是一个程序正在执行的过程;
线程就是进程内部的一条执行路径,或者一个执行序列;

二.进程和线程的区别

进程是资源分配的最小单位,线程是 CPU 调度的最小单位
进程有自己的独立地址空间,线程共享进程中的地址空间
进程的创建消耗资源大,线程的创建相对较小
进程的切换开销大,线程的切换开销相对较小

三.线程的实现

在操作系统中,线程的实现有以下三种方式:
71-Linux_线程_第2张图片
不同平台,线程的实现是不一样的;
Linux中线程的实现:

Linux 实现线程的机制非常独特。从内核的角度来说,它并没有线程这个概念。

Linux 把所有的线程都当做进程来实现。内核并没有准备特别的调度算法或是定义特别的数据结构来表征线程。相反,***线程仅仅被视为一个与其他进程共享某些资源的进程。***每个线程都拥有唯一隶属于自己的 task_struct,所以在内核中,它看起来就像
是一个普通的进程(只是线程和其他一些进程共享某些资源,如地址空间)

四.线程的接口

1.pthread_create

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
pthread_create()用于创建线程
thread: 接收创建的线程的 ID
attr: 指定线程的属性,一般不设置线程属性为NULL;
start_routine: 指定线程函数,这个线程函数的参数为void ,返回值也为void ;这是一个函数指针;
arg: 给线程函数传递的参数(线程刚启动,线程函数的参数为void
,给它传参就是void
)//成功返回 0, 失败返回错误码

2.pthread_join

int pthread_join(pthread_t thread, void **retval);
pthread_join()等待 thread 指定的线程退出,线程未退出时,该方法阻塞 //有点像父进程等待子进程结束的wait,或者说合并线程;
retval:接收 thread 线程退出时,指定的退出信息

3.pthread_exit

int pthread_exit(void *retval);
pthread_exit()退出线程
retval:指定退出信息

五.例题

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <string.h>
5 #include <assert.h>
6 #include <pthread.h>
7 void *fun(void *arg)
8 {
9 int i=0;
10 for(;i<10;i++)
11 {
12 printf("fun run\n");
13 sleep(1);
14 }
15 // pthread_exit("fun over");
16 pthread_exit(NULL);
17 }
18
19 int main()
20 {
21 pthread_t id;
22 pthread_create(&id,NULL,fun,NULL);
23
24 int i=0;
25 for(;i<5;i++)
26 {
27 printf("main run\n");
28 sleep(1);
29 }
30 // char *s=NULL;
31 //pthread_join(id,(void **)&s);
32 //printf("join:s=%s\n",s);
33
34 pthread_join(id,NULL);
35 exit(0);
36 }

你可能感兴趣的:(Linux,linux,运维,服务器)