线程详解
来源:互联网 发布:淘宝类目退货率数据 编辑:程序博客网 时间:2024/05/29 17:03
相关函数:
#include <pthread.h>int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg);
pthread_t *thread: 用来得到所创建的线程的ID,所以要创建变量,传入地址。
pthread_attr_t *attr: 线程的属性结构体变量地址,如果不特别指定属性,可以使用默认属性NULL。
start_routine: 线程函数,线程函数一般一个不退出的死循环。
arg:这是Linux系统在调用线程函数时传入的参数。
/定义分离参数/
pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
/如果没有设置分离参数,则要用此函数回收线程/
pthread_join(id2,&pthread_return_value); /*取消线程*/pthread_cancel();
线程属性函数:
1、初始化一个线程对象的属性
int pthread_attr_init(pthread_attr_t *attr);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针说 明:Posix线程中的线程属性pthread_attr_t主要包括scope属性、detach属性、堆栈地址、堆栈大小、优先级。 pthread_attr_init实现时为属性对象分配了动态内存空间。头文件:#include <pthread.h>
2、销毁一个线程属性对象
int pthread_attr_destroy(pthread_attr_t *attr);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针说 明:经pthread_attr_destroy去除初始化之后的pthread_attr_t结构被pthread_create函数调用,将会导致其返回错误。头文件:#include <pthread.h>
3、获取线程间的CPU亲缘性
int pthread_attr_getaffinity_np(pthread_attr_t *attr, size_t cpusetsize, cpu_set_t *cpuset);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针说 明:获取线程的CPU亲缘属性头文件:#include <pthread.h>
4、设置线程的CPU亲缘性
int pthread_attr_setaffinity_np(pthread_attr_t *attr, size_t cpusetsize, const cpu_set_t *cpuset);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 cpusetsize 指向CPU组的缓冲区大小 cpuset 指向CPU组的指针说 明:通过指定cupset来设置线程的CPU亲缘性头文件:#include <pthread.h>
5、获取线程分离状态属性
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 detachstate 保存返回的分离状态属性说 明:获取线程分离状态属性头文件:#include <pthread.h>
6、修改线程分离状态属性
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 detachstat 有两个取值 PTHREAD_CREATE_DETACHED(分离) PTHREAD_CREATE_JOINABLE(非分离)说 明:Posix线程中的线程属性pthread_attr_t主要包括scope属性、detach属性、堆栈地址、堆栈大小、优先级。头文件:#include <pthread.h>
7、获取线程的栈保护区大小
int pthread_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 guardsize 返回获取的栈保护区大小说 明:获取线程的栈保护区大小头文件:#include <pthread.h>
8、设置线程的栈保护区大小
int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 guardsize 线程的栈保护区大小说 明:参数提供了对栈指针溢出的保护。 默认为系统页大小 如果设置为0表示没有保护区。 大于0,则会为每个使用 attr 创建的线程提供大小至少为 guardsize 字节的溢出保护区头文件:#include <pthread.h>
9、获取线程的作用域
int pthread_attr_getscope(pthread_attr_t *attr, int *scope);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 scope 返回线程的作用域说 明:指定了作用域也就指定了线程与谁竞争资源头文件:#include <pthread.h>
10、设置线程的作用域
int pthread_attr_setscope(pthread_attr_t *attr, int scope);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 guardsize 线程的作用域,可以取如下值 PTHREAD_SCOPE_SYSTEM 与系统中所有进程中线程竞争 PTHREAD_SCOPE_PROCESS 与当前进程中的其他线程竞争说 明:指定了作用域也就指定了线程与谁竞争资源头文件:#include <pthread.h>
11、获取线程的堆栈信息(栈地址和栈大小)
int pthread_attr_getstack(pthread_attr_t *attr, void **stackaddr, size_t *stacksize);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 stackaddr 返回获取的栈地址 stacksize 返回获取的栈大小说 明:获取线程的堆栈地址和大小头文件:#include <pthread.h>
12、设置线程堆栈区
int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 stackaddr 线程的堆栈地址:应该是可移植的,对齐页边距的 可以用posix_memalign来进行获取 stacksize 线程的堆栈大小:应该是页大小的整数倍说 明:设置堆栈区,将导致pthread_attr_setguardsize失效。头文件:#include <pthread.h>
13、获取线程堆栈地址
int pthread_attr_getstackaddr(pthread_attr_t *attr, void **stackaddr);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 stackaddr 返回获取的栈地址说 明:函数已过时,一般用pthread_attr_getstack来代替头文件:#include <pthread.h>
14、设置线程堆栈地址
int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 stackaddr 设置线程堆栈地址说 明:函数已过时,一般用pthread_attr_setstack来代替头文件:#include <pthread.h>
15、获取线程堆栈大小
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 stacksize 返回线程的堆栈大小说 明:获取线程堆栈大小头文件:#include <pthread.h>
16、设置线程堆栈大小
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 guardsize 线程的栈保护区大小:应该是页大小的整数倍说 明:设置线程堆栈大小:头文件:#include <pthread.h>
17、获取线程的调度策略
int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 policy 返回线程的调度策略说 明:获取线程的调度策略头文件:#include <pthread.h>
18、设置线程的调度策略
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 policy 线程的调度策略,有如下三种: SCHED_FIFO 先入先出策略 SCHED_RR 轮转调度,类似于 FIFO,但加上了时间轮片算法 SCHED_OTHER 系统默认策略说 明:设置线程的调度策略头文件:#include <pthread.h>
19、获取线程的调度参数
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 param 返回获取的调度参数,该结构仅有一个从参数,如下 struct sched_param { int sched_priority; /* Scheduling priority */ };说 明:获取线程的调度参数头文件:#include <pthread.h>
20、设置线程的调度参数
int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param);
返回值:若是成功返回0,否则返回错误的编号形 参: attr 指向一个线程属性的指针 param 要设置的调度参数说 明:设置线程的调度参数头文件:#include <pthread.h>
21、获取线程是否继承调度属性
int pthread_attr_getinheritsched(pthread_attr_t *attr, int *inheritsched);
返回值:若是成功返回0,否则返回错误的编号
形 参:
attr 指向一个线程属性的指针
inheritsched 返回继承调度属性的设置
说 明:获取线程是否继承调度属性
头文件:#include
int pthread_attr_getinheritsched(pthread_attr_t *attr, int *inheritsched);
返回值:若是成功返回0,否则返回错误的编号
形 参:
attr 指向一个线程属性的指针
guardsize 设置线程是否继承调度属性
PTHREAD_INHERIT_SCHED:调度属性将继承于正创建的线程
attr中的设置将被忽略
PTHREAD_EXPLICIT_SCHED 调度属性将被设置为attr中指定的属性
1.线程的创建
安装在线man帮助:
sudo apt-get install manpages-posix manpages-posix-dev
#include <pthread.h> int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg);
返回值:成功返回0,失败返回错误号。以前学过的系统函数都是成功返回0,失败返回-1,而错误号保存在全局变量errno中,而pthread库的函数都是通过返回值返回错误号,虽然每个线程也都有一个errno,但这是为了兼容其它函数接口而提供的, pthread库本身并不使用它,通过返回值返回错误码更加清晰。
#include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<string.h>int count = 0;void * thread_fun(void *arg){ char buff[BUFSIZ]; fork(); /*父进程的线程会创建,子进程的子线程会创建,主线程不会运行*/ while(1) { memcpy(buff,"hello",6); printf("%d ,%d ,%s ,thread_fun sleeping..\n", getpid(),count++,buff); sleep(1); } pthread_exit((void *)1);}int main(){ int count = 0; char buff[BUFSIZ]; pthread_t id; // fork(); /*创建进程,子进程和父进程里都有线程的创建*/ int err = pthread_create(&id,NULL,thread_fun,NULL); id = pthread_self(); printf("id = %u\n",id); if(err) { printf("pthread_create fail with error %d\n",err); return 1; } // fork(); /*只有父进程的线程在运行*/ while(1) { strcpy(buff,"123"); printf("%d ,%d ,%s ,main sleeping..\n", getpid(),count++,buff); sleep(1); } return 0;}
2.线程和进程的区别:
•多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响.•线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。
- 线程详解
- 线程详解
- *线程详解*
- 线程详解
- 线程详解
- 线程详解
- 线程详解
- 线程详解
- 线程详解
- 线程详解
- 线程详解
- 线程-线程详解
- 通用线程:POSIX 线程详解
- 通用线程:POSIX 线程详解
- 通用线程:POSIX 线程详解
- POSIX 线程详解
- Java线程详解
- POSIX 线程详解(1)
- linux在history上加上命令执行时间,用户和IP源等
- Leetcode 14 - Longest Common Prefix
- 批量改价功能
- WEB扫描类产品测试--AppScan-WVS-WebRavor(5)
- java修改session默认过期时间
- 线程详解
- 树莓派WIFI设置
- 深入分析JavaWeb Item49 -- Struts2中常用标签与主题
- batch语言安装打开软件,注册表的操作
- float的本质
- 面试题9:斐波那契数列
- iOS开发new与alloc/init的区别
- Android AIDL使用详解
- spring单例注入init