进程是管理资源的单位,线程是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 线程IDattr 线程的一些属性(线程的调度策略,线程的优先级,线程栈的大小)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);