赞
踩
一、线程的意义:
二、再分析创建线程函数
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
三、设置线程的优先级
Linux内核的三种调度策略:
系统创建线程时,默认的线程是SCHED_OTHER。所以如果我们要改变线程的调度策略的话,可以通过下面的这个函数实现。
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);
四、将线程与CPU”捆绑“: CPU的亲和性
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);
补充:cache line
https://blog.csdn.net/KingOfMyHeart/article/details/97942190
五、线程的状态: 分离与非分离
在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。 1. 一个可结合的线程能够被其他线程收回其资源和杀死; 在被其他线程回收之前,它的存储器资源(如栈)是不释放的。 2. 相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。 1. 线程的分离状态决定一个线程以什么样的方式来终止自己。 在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束。 只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。 2. 而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。 程序员应该根据自己的需要,选择适当的分离状态。 所以如果我们在创建线程时就知道不需要了解线程的终止状态, 则可以pthread_attr_t结构中的detachstate线程属性,让线程以分离状态启动。
可以参考这个链接,写的很明白:https://blog.csdn.net/lhf_tiger/article/details/8291984
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);
六、线程栈的大小以及私有数据:
线程级别的全局变量,是不是听起来很奇怪;
int i ; //全局变量,但是对于每个线程它的值可能不一样
线程私有数据: https://blog.csdn.net/caigen1988/article/details/7901248
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
int pthread_key_delete(pthread_key_t key);
int pthread_setspecific(pthread_key_t key, const void *value);
void *pthread_getspecific(pthread_key_t key);
errno :key - value(线程设置errno的key,并且设置errno的值)
七、栈溢出保护区
出于以下两个原因,为应用程序提供了 guardsize 属性:
原因一: 溢出保护可能会导致系统资源浪费。如果应用程序创建大量线程,并且已知这些线程永远不会溢出其栈,则可以关闭溢出保护区。通过关闭溢出保护区,可以节省系统资源。
原因二:线程在栈上分配大型数据结构时,可能需要较大的溢出保护区来检测栈溢出。
guardsize 参数提供了对栈指针溢出的保护。
允许合乎惯例的实现,将 guardsize 的值向上舍入为可配置的系统变量 PAGESIZE 的倍数。请参见 sys/mman.h 中的 PAGESIZE。如果实现将 guardsize 的值向上舍入为 PAGESIZE 的倍数,则以 guardsize(先前调用 pthread_attr_setguardsize() 时指定的溢出保护区大小)为单位存储对指定 attr 的 pthread_attr_getguardsize() 的调用。
八、线程对资源的竞争范围
int pthread_attr_setscope(pthread_attr_t *attr, int scope);
int pthread_attr_getscope(const pthread_attr_t *attr, int *scope);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。