主要考察第二个参数:属性对象主要包括是否绑定、是否分离、堆栈地址、堆栈大小、优先级。
默认的属性是非绑定、非分离、缺省的堆栈、与父进程同样级别的优先级。
#include
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy); // 调度
int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param);
int pthread_attr_setscope(pthread_attr_t *attr, int scope);
int pthread_attr_getscope(pthread_attr_t *attr, int *scope);
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
线程的分离状态决定一个线程以什么样的方式来终止自己。
非分离状态:线程的默认属性是非分离状态,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。
分离状态:分离线程没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。应该根据自己的需要,选择适当的分离状态。
- SCHED_OTHER:分时调度策略(Linux线程默认的调度策略)。线程优先级为0,每个线程都不抢占其他的线程。线程会受到时间片的限制。会一直占用系统分配给他的时间片。
- SCHED_FIFO:实时调度策略,先到先服务。该策略简单的说就是一旦线程占用CPU则一直运行,一直运行直到有更高优先级任务到达或自己放弃。
- SCHED_RR:实时调度策略,时间片轮转。给每个线程增加了一个时间片限制,当时间片用完后,系统将把该线程置于队列末尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平。
假设一个进程中包含多个线程,这些线程共享变量 x,我们希望某个(或某些)线程等待 "x==10’ 条件成立后再执行后续的代码,该如何实现呢?
您可能想到用 while 循环实现,例如:
void* th