开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:Pthread_create 线程创建】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11058
Pthread_create 线程创建
内容介绍:
一、基础知识
二、线程的创建
三、实例
四、注意
一、基础知识
就像每个进程都有一个进程号一样,每个线程也有一个线程号。
进程号在整个系统中是唯一的,但线程号不同,线程号只在它所属的进程环境中有效。
进程号用 pid_t 数据类型表示,是一个非负整数。线程号则用 pthread_t 数据类型来表示。
有的系统在实现 pthread _t 的时候,用一个结构体来表示,所以在可移植的操作系统实现不能把它做为整数处理
二、线程的创建
通过多线程实现多任务
1.格式
#include <pthread. h>
int pthread_create (pthread_t *thread, const pthread_attr_t *attr,
void *( *start_routine)(void *) , void *arg);
2.功能:
创建一个线程
3.参数:
thread:线程标识符地址。
attr:线程属性结构体地址。(一般用默认属性 NULL)
start_routine:线程函教的入口地址。
arg:传给线程函数的参数。
4.返回值:
成功:返回0
失败:返回非0
5.注意:
(1)与fork 不同的是 pthread_create 创建的线程不与父线程在同一点开始运行,而是从指定的函数开始运行,该函数运行完后,该线程也就退出了。
(2)线程依赖进程存在的,如果创建线程的进程结束了,线程也就结束了。
(3)线程更数的程序在 pthread 库中,故链接时要加上参数 lpthread。
三、实例
#incluce <stdio.h>
#include <unistd. h>
#include <pthread.h>
void *thread_fun1(void *arg)
{
while(1){
printf(“this is thread 1\n”);
sleep(1)
//每一秒打印一条消息
}
}
void *thread_fun2(void *arg)
//如果第二个线程创建成功,则在该函数中执行任务
{
while(1){
printf(“this is thread 2\n”);
sleep(1)
}
}
int main(int argc , char *argv[])
//main 函数是主线程,main 函数结束则主线程也结束
{
pthread_t tid1, tid2 ;
//保存线程号
int ret;
ret= pthread_create(&tid1,NULL,thread_fun1,NULL);
//创建第一个线程
if(ret!= 0){
//判断是否成功perror(“pthread_create”);
return 0;
}
ret= pthread_create(&tid2,NULL,thread_fun2,NULL);
//创建第二个线程
if(ret!= 0){
perror(“pthread_create”);
return 0;
}
while(1);
//进入死循环,main 函数不结束,所以进程不结束,即线程不结束
return 0;
}
四、注意
在 main 函数中创建任务时,调度的顺序不一定,与操作系统的调度算法。
线程依赖进程存在,若将实例主函数中的 while(1);删除,则主线程结束,进程结束,即线程不复存在。