进程是管理资源的单位,线程是CPU调度的基本单位。
1.定义
linux线程创建函数的定义:
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
返回0表示创建成功,否则失败。
参数:
- thread 线程ID
- attr 线程的一些属性(线程的调度策略,线程的优先级,线程栈的大小)
- start_routine 线程执行函数的回调
- arg 传递给线程的参数
2.实例
#include<pthread.h>
#include<stdio.h>
void* thread_proc(void* arg){
printf("thread_proc\n");
}
int main(){
pthread_t thread_id;
int ret = pthread_create(&thread_id, NULL,thread_proc,NULL);
if(ret){
printf("pthread_creat fail!");
return 0;
}
usleep(1);
printf("main thread\n");
getchar();
}
注意:gcc编译的时候需要加 -lpthread 选项。
3.线程相关API
(1)线程优先级设置
#include <pthread.h>
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
策略有:SCHED_FIFO, SCHED_RR, and SCHED_OTHER
- SCHED_FIFO 实时调度策略,先到先服务
- SCHED_RR 时间片轮转
- SCHED_OTHER 分时调度策略
默认是SCHED_OTHER。
(2)线程的分离和非分离
分离:线程创建的时候和主线程没有任何关系,线程退出,线程资源就被销毁。
#include <pthread.h>
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
非分离:主线程一直要等子线程执行完了才结束,所以需要用pthread_join等待子线程结束。
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
(3)CPU的亲缘性
线程在CPU上执行的时候,经常访问到的资源(变量)缓存在CPU上,来回切换会效率低下,所以设置亲缘性,即将线程绑定在某个CPU上执行,而不是在多个CPU上切换。
#include <pthread.h>
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset);
(4)线程栈的设置
默认1M大小。
#include <pthread.h>
int pthread_attr_setstack(pthread_attr_t *attr,void *stackaddr, size_t stacksize);
int pthread_attr_getstack(const pthread_attr_t *attr,void **stackaddr, size_t*stacksize);
#include <pthread.h>
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);
(5)线程的私有数据
#include <pthread.h>
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
int pthread_key_delete(pthread_key_t key);
void *pthread_getspecific(pthread_key_t key);
int pthread_setspecific(pthread_key_t key, const void *value);
(6)栈溢出保护区
#include <pthread.h>
int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
int pthread_attr_getguardsize(const pthread_attr_t *attr, size_t *guardsize);
(7)线程的竞争范围
#include <pthread.h>
int pthread_attr_setscope(pthread_attr_t *attr, int scope);
int pthread_attr_getscope(const pthread_attr_t *attr, int *scope);