linux线程相关函数及使用

一、linux下安装posix手册

apt-get install manpages-posix-dev
  • man -k pthread 查看posix函数列表
  • man [函数名] 查看函数的具体用法

pthread库不是Linux系统默认的库,连接时需要使用静态库libpthread.a,所以在线程函数在编译时,需要连接库函数: gcc pthread_create.c -o pthread_create -lpthread

二、posix线程相关函数

  1. pthread_create函数
函数原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr,  void *(*start_routine) (void *), void *arg);
函数功能:创建一个线程
函数参数:pthread_t 线程id
         pthread_attr_t 线程属性,为空时使用默认属性
         start_routine 需要运行的函数
         arg 传递给start_routine的参数
返回值: 成功返回0,失败返回对应的错误类型;
说明:  1)线程的退出可以使用pthread_exit退出,也可以直接return退出;
       2)如果创建线程的main函数退出,该main函数中的所有线程都将被销毁;

2.pthread_join函数

函数原型:int pthread_join(pthread_t thread, void **retval);
函数功能:等待线程结束
函数参数:thread 线程ID
          retval 线程函数的返回值
返回值:成功返回0,失败返回对应的错误类型
说明:调用该函数会阻塞直到对应的线程退出,目的是在线程结束时回收线程的相关资源。

3.pthread_detach函数

函数原型:int pthread_detach(pthread_t thread);
函数功能:调用该函数后,线程在运行结束后会自动释放系统分配的资源,而不需要调用pthread_join等待线程结束。
函数参数:thread 线程ID
返回值:成功返回0,失败返回对应的错误类型

4.pthread_exit函数

函数原型:void pthread_exit(void *retval);
函数功能:结束一个线程,等同于return
函数参数:retval 需要返回的参数
返回值:无
说明:retval指向的变量不能是栈变量,因为栈变量在函数退出时会自动销毁。

5.pthread_self()函数

函数原型: pthread_t pthread_self(void);
函数功能:获取当前线程的id
函数参数:无
返回值:返回当前线程的id号

三、线程的detached和joinable属性

  • [1] 线程在创建时默认属性是joinable的,也就是说在线程退出时必须调用pthread_join来等待线程结束,回收线程的资源,优点类似于进程中的僵尸进程;
  • [2]如果将线程属性设置为detached,那么在线程退出时,系统会自动回收线程的相关资源,而不必调用pthread_join等待线程结束。

示例:

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

void posix_thread_test();
pthread_t g_pthread_id;

int main()
{
	posix_thread_test();
}
void *test_fn(void *param)
{
	int *retval = NULL;
	retval = malloc(sizeof(int));
	*retval = 33;
	if(NULL != param)
	{
		printf("%s\r\n",param);
	}
	pthread_exit((void*)retval);
	//return retval;
}
void posix_thread_test()
{
	int ret = -1;
	void *pret = NULL;
	pthread_attr_t *attr=NULL;
	char arg[] = "test func param";
	ret = pthread_create(&g_pthread_id,attr,test_fn,arg);
	if(0 == ret)
	{
		printf("create thread sucess,id %u\r\n",g_pthread_id);
	}
	else
	{
		printf("thread create fail\r\n");
	}
	ret = pthread_join(g_pthread_id,&pret);
	
	if(0 == ret)
	{
		printf("test thread exit,exit param:%d\r\n",*(int*)pret);
		free(pret);
	}
}

运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TLRozCX0-1594641974706)(2E0438E39449498680CEE07D57D66A1C)]

注意上述例程中test_fn中retval是使用malloc分配的内存,所以在pthread_join之后需要主动释放。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值