概述
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
注意
线程和进程之间的区别
1. 线程是执行的基本单位;进程是资源分配的基本单位。
2. 线程共享进程的资源,一个进程中至少有一个线程. 主线程。
3. 进程有自己的pid,还有自己的PCB;线程有自己的tid,也有自己的TCB。
4. 线程也有自己私有的资源。
另外,小编所有文章均是自己亲手编写验证,由于文件太多,小编就不在公众号后台一一回复列举了,若需要小编的工程代码,请关注公众号:不只会拍照的程序猿,后台回复需要的工程文件。小编看到后会第一时间回复。
接口
线程创建
进程被创建时,系统会为其创建一个主线程,而要在进程中创建新的线程,则可以调用pthread_create。另外创建新的线程以后,新的线程和原来的线程是异步的。
/** * @ 创建一个新的线程 "pthread_create(3)" * @ thread: 新创建的线程的id存储到这里 attr:NULL表明线程创建的时候,使用默认属性 * @ start_routine: 线程的执行函数 arg:传递给线程执行函数的唯一的参数 * @ 成功返回0;错误返回一个错误号errno被设置 */ int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
线程终止
线程终止有三种方式。
方式一:执行完成后隐式退出。
方式二:由线程本身显示调用pthread_exit 函数退出。
/** * @ 终止当前线程 "pthread_exit(3)" * @ retval: 通过这个参数返回一个值,这个值被同一进程中的另外一个线程调用pthread_join(3)使用 */ void pthread_exit(void *retval);
方式三:被其他线程用pthread_cance函数终止。
/** * @ 给一个线程发送取消请求 "pthread_cancel(3)" * @ thread: 指定了目标线程的id * @ 成功返回0;错误返回非0错误码 */ int pthread_cancel(pthread_t thread);
线程汇合
主线程可以等待子线程终止并与之汇合后继续运行,子线程终止后主线程将回收该线程的相关资源。
/** * @ 汇合一个终止的线程 "pthread_join(3)" * @ thread: 指定了要汇合的线程的id.目标线程的id * @ retval: 退出状态码被保存到*retval中.如果是被取消的线程,PTHREAD_CANCELED---->*retval中 * @ 成功返回0;错误返回一个错误号 */ int pthread_join(pthread_t thread, void **retval);
线程分离
/** * @ 分离一个线程 "pthread_detach(3)" * @ thread: 指定了要分离的线程的id * @ 成功返回0;错误返回一个错误号 */ int pthread_detach(pthread_t thread);
获取线程的tid
/** * @ 获取当前线程的id "pthread_self(3)" * @ 返回当前的线程的id */ pthread_t pthread_self(void);
示例
★示例通过pthread_test.c向用户展示线程的基本使用。
★包含演示程序pthread_test.c(已验证通过)。
pthread_test.c
/** * @Filename : pthread_test.c * @Revision : $Revision: 1.00 $ * @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅) * @Description : 线程的基本应用示例 **/ #include <stdio.h> #include <pthread.h> #include <unistd.h> /** * @ 线程执行函数 * @ args: 传递来的参数 */ static void *thread1(void *args) { /* 1. 获取参数信息 */ printf("%s\n", (char *)args); /* 2. 获取当前线程id */ pthread_t pthread_self (void); printf("tid is %lu\n", (int)pthread_self()); sleep(3); return (void *)7; } /** * @ 主函数,程序入口 */ int main(void) { void *ret; pthread_t tid; /* 线程ID */ /* 创建线程 */ if (pthread_create(&tid, NULL, thread1, "feng") != 0) { printf("pthread create failed...\n"); return -1; } /* 阻塞等待线程的汇合,接收线程的退出状态码 */ pthread_join(tid, &ret); printf("thread1 exit code %d\n", (int)ret); return 0; }
验证
编译程序,记得加库-pthread
#编译代码,记得-pthread ubuntu@U:~/study/pthread$ gcc pthread_test.c -pthread ubuntu@U:~/study/pthread$
执行程序
#执行代码 ubuntu@U:~/study/pthread$ ./a.out feng tid is 2908280576 thread1 exit code 7 ubuntu@U:~/study/pthread$
往期 · 推荐
实时系统vxWorks - 任务(重要)
实时系统vxWorks - 加载应用程序的方法
实时系统vxWorks - 在线调试
实时系统vxWorks - 虚拟机环境搭建
实时系统vxWorks - zynq7020移植vxWorks