Summer的小屋 2020-04-20
一.概述
linux中不区分进程和线程,都认为是个任务,都是创建一个task_struct.如何区分?线程是共享相同地址空间,而进程是独占地址空间.
多线程共享同一进程的地址空间
优点:
通信方便,可以通过全局变量.
缺点:
访问共享数据时需要考虑同步和互斥.
二.线程共享资源:
可执行的指令
静态数据
进程中打开的文件描述符
当前工作目录
用户ID
用户组ID
三.线程私有资源:
线程ID
PC(程序计数器)和相关寄存器:保证不同线程执行不同的代码.
堆栈
错误号
优先级
执行状态和属性
四.Linux线程库:
pthread线程库:(POSIX)
1.创建线程:
2.回收线程(pthread_join):
pthread_join(pthread_t thread, void **retval)
*retval接收线程thread函数对应的返回值,比如return返回的值或者pthread_exit中的retval.(两者是等效的)
3.结束线程(pthread_exit):
结束当前线程,而exit是结束当前的进程.
pthread_exit(void *retval)相当于return retval;可以是各种类型.
retval可被其他线程通过pthread_join获取.
示例:
#include<stdio.h> #include<unistd.h> #include<pthread.h> void * task(void * param) { sleep(5); printf("hello\n"); //pthread_exit(NULL); //pthread_exit("子线程执行完毕"); //既可以返回NULL,也可以返回字符串. return "子线程执行完毕"; } int main() { //初始化线程 pthread_t tid; void *result; //创建线程 int rc = pthread_create(&tid, NULL, task, NULL); if(rc) { printf("线程创建失败!\n"); return -1; } pthread_join(tid, &result); printf("创建主线程\n"); printf("result is %s\n", result); pthread_exit(NULL); //退出,并返回NULL,有个就不需要return 0了. }