线程

    xiaoxiao2022-07-07  191

    进程是管理资源的单位,线程是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);

     

    最新回复(0)