Linux 线程基础

目录

1、线程概念

2、进程与线程的区别

3、线程相关 shell 命令

4、线程相关API

4.1 pthread_create:创建线程

4.2 pthread_exit:线程退出

4.3 pthread_join:回收线程资源(类似于进程的wait())

5、线程程序


1、线程概念

1、线程被称为轻量级进程,是程序执行流的最小单元
2、线程是进程中的一个实体,是被系统独立调度和分派的基本单位
3、线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源

4、由于进程的地址空间是私有的,因此在进程间上下文切换时,系统开销比较大,在同一个进程中创建的线程共享该进程的地址空间
5、每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身
6、线程也有就绪、阻塞和运行三种基本状态。
7、Linux 里同样用 task_struct 来描述一个线程。线程和进程都参与统一的调度

8、一个进程中的多个线程共享的资源:可执行的指令、静态数据、进程中打开的文件描述符、信号处理函数、当前工作目录、用户 ID、用户组 ID

9、每个线程私有的资源:线程 ID (TID)、PC( 程序计数器 和相关寄存器、堆栈、局部变量、返回地址、错误号 errno、信号掩码和优先级、执行状态和属性

2、进程与线程的区别

1、进程是资源分配的最小单位,线程是程序运行的最小单位

2、进程之间有独立的用户空间(进程之间相互独立),所以进程之间如果要进行通信,需要引入进程间通信机制。

同一进程下的线程共享其附属进程的所有资源,所以不需要引入通信机制,但是需要注意同步互斥。

3、创建子进程的时候需要克隆父进程的所有资源,而创建线程不需要克隆资源,因为本身就共享同一进程下的资源。

所以创建多线程的效率比创建多进程的效率高。

4、由于进程之间相互独立,线程共享同一进程下的资源,所以多进程的稳定性比多线程高,且多进程的资源量比多线程高。

3、线程相关 shell 命令

查看某个进程的线程

ps -efL | grep 进程ID或名字

4、线程相关API

4.1 pthread_create:创建线程

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                    void *(*start_routine) (void *), void *arg);
/*
功能:创建线程;
头文件:
       #include <pthread.h>
参数:
    @thread:存储创建后线程的tid号;
	@attr:线程的属性,默认属性填NULL;
	@void *(*start_routine) (void *):函数指针,指向的是线程的执行体函数,回调函数
							且该指针能指向返回值是void*类型,参数列表是void*类型的函数
	@arg:传入给执行体函数的参数;
返回值:
    成功,返回0;
	失败,返回错误码;
*/

4.2 pthread_exit:线程退出

void pthread_exit(void *retval);
/*功能:退出当前线程;
头文件:
       #include <pthread.h>
参数:
    @retval:传递退出线程的状态值,可以是任意类型的数据地址,也可以填NULL;
			可以被pthread_join函数接收;
*/

4.3 pthread_join:回收线程资源(类似于进程的wait())

int pthread_join(pthread_t thread, void **retval);
/*
功能:阻塞等待子线程退出,并回收退出线程的资源。
头文件:
    #include <pthread.h>
参数:
    @thread:指定要回收的线程的tid号;
	@retval:该指针指向的内存空间中会存储线程退出状态值,
             即 pthread_exit(void* retval)中的retval;
			 如果不想存储退出状态值,则该参数填NULL;
返回值:
    成功,返回0;
	失败,返回错误码;
*/

5、线程程序

int a = 10;
int flag = 0;

void* pthread1_func(void* arg)
{
	while(1) {
		if(0 == flag) {
			printf("%d\n", a);
			flag = 1;
		}
	}
	pthread_exit(NULL);
}

void* pthread2_func(void* arg)
{
	while(1) {
		if(1 == flag) {
		    for (i = 0; i < 10; i++) {
                a++;
            }
			flag = 0;
		}
	}
	pthread_exit(NULL);
}

int main(int argc, const char *argv[])
{
	//创建两个线程
	pthread_t tid1, tid2;

	//一个线程循环打印
	pthread_create(&tid1, NULL, pthread1_func, NULL);
 
	//一个线程一直使变量增加
	pthread_create(&tid2, NULL, pthread2_func, NULL);

	pthread_join(tid1, NULL);
	pthread_join(tid2, NULL);

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值