和我一起学 Linux多线程编程(一)

下一节传送门https://blog.csdn.net/qq_37120369/article/details/101164870

一、首先我们来认识线程

在讲线程前我们先提一下进程,进程是系统中程序执行和资源分配的基本单位

线程则是进程内独立的一条运行路线,是处理器调度的最小单位,也称轻量级进程,在一个进程中的多个执行路线就叫做线程。

要注意的是,由于线程共享了进程的资源和地址空间,因此,任何线程对系统共享资源的操作都会给其他线程带来影响,所以线程的同步很重要了

编写线程程序最主要的是要考虑同步与互斥问题

linux下多线程遵从POSIX接口,编写时源文件时需要包含头文件pthread.h,编译时需要连接库文件libpthread.a ,

编译时带上-lpthread的选项

 

二、linux线程的基本函数

1.    函数pthread_create用于创建一个新线程

参数详解:

 thread  用来表明创建线程的ID,如果线程创建成功则通过这个指针返回

 attr  指明线程创建时的属性,NULL表示默认属性

start_routine   函数指针,指向线程创建成功后开始执行的函数

arg  传递给start_routine所指函数的唯一参数

返回值:

成功返回 0;错误返回出错码

2.    线程的退出

       先介绍一下  线程退出有俩种方式,其一,在线程函数结尾用return或者自行运行完线程函数,线程函数自然结束,这是最常见的方法。其二,通过函数pthread_exit退出线程。

参数详解:

retval 线程返回值

返回值:

退出当前线程返回retval,父线程或其他线程可以通过pthread_join获取它

3.     等待线程退出函数

该函数的作用是悬挂当前线程,直到线程编号为thread(函数参数)的线程被终止结束,类似waitpid函数。

当一个线程调用了pthread_exit函数时,其他线程或进程使用pthread_join等待该线程结束,那么线程的ID和退出状态会一直保留到pthread_join执行时。pthread_exit函数设定的返回值(retval)、或者线程函数return的返回值可以被pthread_join函数的参数(thread_return)捕获。

参数详解:

thread:被等待的线程ID

thread_return:用户定义的指针,用来存储被等待线程返回值

返回值:

成功返回0;错误返回-1

参考程序

#include <stdio.h>

#include <stdlib.h>

#include <pthread.h>

#include <unistd.h>



#define RUN_TIME 5



//定义线程函数

void * thread(void * arg)

{

int i;

int no=(int)arg;

for(i=0;i<RUN_TIME;i++)

{

printf("This is a pthread %d\n",no);

sleep(1);

}

}

int main(void)

{

pthread_t id;

int i,ret;

//创建线程

ret=pthread_create(&id,NULL,(void *) thread,(void *)1);

if(ret!=0){

printf("Create pthread error!\n");

exit(1);

}

for(i=0;i<RUN_TIME;i++)

{

printf("This is the main process.\n");

sleep(1);

}

//等待线程退出

pthread_join(id,NULL);

return (0);

}

编译及执行过程如下:

 

出现警告时由于在线程函数中对传进的参数做了强制转换

 

补充:程序的主进程默认为主线程。主线程退出(例如main函数里的exit),它的子线程无论是否执行完成,都会随着主线程消失而消失。所以,一般在主函数里必须判断子线程是否真正退出(否则容易出现程序结果不正确),最常用的方法就是使用pthread_join等待子线程退出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章