【linux系统编程学习笔记】第八节:线程初认识(pthread_create 线程创建、pthread_join  线程回收、pthread_exit  线程退出)

本文深入探讨线程的基本概念,包括线程的特点、API使用,以及如何通过pthread_create、pthread_join和pthread_exit进行线程的创建、回收和退出。通过实例代码,详细解析线程在实际编程中的应用。

线程初认识

线程的基本概念

线程特点及API

pthread_create 线程创建

pthread_join  线程回收

pthread_exit  线程退出

例程:


线程的基本概念

        线程实际上是应用层的概念,一个进程内部的多条线程共享了大部分资源,但是还是有一些信息是各自独立的一一比如其运行状态,当一个线程处于睡眠的时候,另一条线程可以正在运行,而或许有些线程已经变成僵尸了!就像一个人是如果是多线程的,他就可以做到一边睡觉一边吃饭一边在洗澡!正是利用线程状态独立的特征,程序才有可能一遍阻塞等待,一遍干别的事情,尽最大可能榨取处理器资源。

       进程是承担分配系统资源的基本实体,线程是CPU调度的基本单位

 

线程特点及API

特点:

  1. 称之为调度的最小单位,CPU的任务调度都是以线程为单位去调度的
  2. 所有的进程里面都有至少一条线程
  3. 如果是同个进程的线程,共享所有资源
  4. 任务队列的依赖原型
  5. 每个线程独立拥有一片栈空间,默认大小为2-8M

pthread_create 线程创建

#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                        void *(*start_routine) (void *), void *arg);

函数功能

  •     在进程当中创建出一条线程

参数:

  • thread:如果进程创建成功,将会往这个内存里面填充一个线程的ID
  • attr:线程的属性变量,创建线程的时候会依赖于这个线程的属性变量去创建出一个线程,这个参数如果需要使用,需要调用pthread_attr_init函数初始化它。如果这个参数为NULL,则代表按照默认属性创建。线程的属性重点包含着如下几点:
    1. 线程的分离属性
    2. 线程的栈空间大小
    3. 线程的优先级
  • start_routine:一个函数指针类型,新的线程将会去执行这个函数的内容
  • arg:这个是传输给start_routine这个函数的参数

返回值:

  • 成功则返回0,失败则返回一个错误值,errno没有被设置

pthread_join  线程回收

#include <pthread.h>

int pthread_join(pthread_t thread, void **retval);

函数功能

  • 等待指定的线程退出,并且接收其返回值

参数:

  • thread:指定等待退出的线程的ID
  • retval:用来接收线程退出的返回值的void *的变量的地址,如果不想接收可以直接填入NULL

返回值:

  • 成功则返回0,失败则返回一个错误值,errno没有被设置

pthread_exit  线程退出

#include <pthread.h>

void pthread_exit(void *retval);

函数功能

  • 退出一个线程,如果所有的线程都退出了,我们就会结束进程

参数:

  • thread:指定等待退出的线程的ID
  • retval:会将线程退出时可以返回给等待这个线程退出的函数pthread_join()

返回值:

注意:

  •           以上函数使用都要链接库 -lpthread

例程:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>

void *new_thread(void *arg)
{
	char *string = arg;
	int i;
	for(i=0; i<3; i++)
	{
		printf("arg=%s\n", string);
		sleep(1);	
	}
	pthread_exit("exit");//退出一个线程
	return "exit";
}

int main(void)
{
	pthread_t tid;
	int retval;
	void *retpoint;

	//创建一条线程
	retval = pthread_create( &tid, NULL, new_thread, "hello thread");
	if(retval != 0)
	{
		//perror("创建线程失败:");
		fprintf(stderr, "创建线程失败:%s\n", strerror(retval));
		return -1;
	}

	pthread_join(tid, &retpoint);//等待回收指定的线程
	printf("接合成功 返回值为%s\n", (char *)retpoint);
	return 0;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值