pthread 简要使用指南(五) 线程属性(pthread

先上代码。suse linux上pthread_attr_init,man(3)上面的例子:

#ifndef _GNU_SOURCE#define _GNU_SOURCE/* To get pthread_getattr_np() declaration */#endif#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#define handle_error_en(en, msg) \do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)static voiddisplay_pthread_attr(pthread_attr_t *attr1, char *prefix){int s, i;size_t v;void *stkaddr;struct sched_param sp;pthread_attr_t *attr = new pthread_attr_t;pthread_attr_init(attr);s = pthread_attr_getdetachstate(attr, &i);if (s != 0)handle_error_en(s, "pthread_attr_getdetachstate");printf("%sDetach state= %s\n", prefix,(i == PTHREAD_CREATE_DETACHED) ? "PTHREAD_CREATE_DETACHED" :(i == PTHREAD_CREATE_JOINABLE) ? "PTHREAD_CREATE_JOINABLE" :"???");s = pthread_attr_getscope(attr, &i);if (s != 0)handle_error_en(s, "pthread_attr_getscope");printf("%sScope= %s\n", prefix,(i == PTHREAD_SCOPE_SYSTEM) ? "PTHREAD_SCOPE_SYSTEM" :(i == PTHREAD_SCOPE_PROCESS) ? "PTHREAD_SCOPE_PROCESS" :"???");s = pthread_attr_getinheritsched(attr, &i);if (s != 0)handle_error_en(s, "pthread_attr_getinheritsched");printf("%sInherit scheduler = %s\n", prefix,(i == PTHREAD_INHERIT_SCHED) ? "PTHREAD_INHERIT_SCHED" :(i == PTHREAD_EXPLICIT_SCHED) ? "PTHREAD_EXPLICIT_SCHED" :"???");s = pthread_attr_getschedpolicy(attr, &i);if (s != 0)handle_error_en(s, "pthread_attr_getschedpolicy");printf("%sScheduling policy = %s\n", prefix,(i == SCHED_OTHER) ? "SCHED_OTHER" :(i == SCHED_FIFO) ? "SCHED_FIFO" :(i == SCHED_RR) ? "SCHED_RR" :"???");s = pthread_attr_getschedparam(attr, &sp);if (s != 0)handle_error_en(s, "pthread_attr_getschedparam");printf("%sScheduling priority = %d\n", prefix, sp.sched_priority);s = pthread_attr_getguardsize(attr, &v);if (s != 0)handle_error_en(s, "pthread_attr_getguardsize");printf("%sGuard size= %d bytes\n", prefix, v);s = pthread_attr_getstack(attr, &stkaddr, &v);if (s != 0)handle_error_en(s, "pthread_attr_getstack");printf("%sStack address= %p\n", prefix, stkaddr);printf("%sStack size= 0x%x bytes\n", prefix, v);}static void * thread_start(void *arg){int s;pthread_attr_t gattr;/* pthread_getattr_np() is a non-standard GNU extension thatretrieves the attributes of the thread specified in itsfirst argument */s = pthread_getattr_np(pthread_self(), &gattr);if (s != 0)handle_error_en(s, "pthread_getattr_np");printf("Thread attributes:\n");display_pthread_attr(&gattr, "\t");exit(EXIT_SUCCESS);/* Terminate all threads */}int main(int argc, char *argv[]){pthread_t thr;pthread_attr_t attr;pthread_attr_t *attrp;/* NULL or &attr */int s;attrp = NULL;/* If a command-line argument was supplied, use it to set thestack-size attribute and set a few other thread attributes,and set attrp pointing to thread attributes object */if (argc > 1) {int stack_size;void *sp;attrp = &attr;s = pthread_attr_init(&attr);if (s != 0)handle_error_en(s, "pthread_attr_init");s = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);if (s != 0)handle_error_en(s, "pthread_attr_setdetachstate");s = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);if (s != 0)handle_error_en(s, "pthread_attr_setinheritsched");stack_size = strtoul(argv[1], NULL, 0);s = posix_memalign(&sp, sysconf(_SC_PAGESIZE), stack_size);if (s != 0)handle_error_en(s, "posix_memalign");printf("posix_memalign() allocated at %p\n", sp);s = pthread_attr_setstack(&attr, sp, stack_size);if (s != 0)handle_error_en(s, "pthread_attr_setstack");}s = pthread_create(&thr, attrp, &thread_start, NULL);if (s != 0)handle_error_en(s, "pthread_create");if (attrp != NULL) {s = pthread_attr_destroy(attrp);if (s != 0)handle_error_en(s, "pthread_attr_destroy");}pause(); /* Terminates when other thread calls exit() */}运行结果:linux:/home/hsl/pthread # ulimit -s8192linux:/home/hsl/pthread # ./pattr.r Thread attributes:Detach state= PTHREAD_CREATE_JOINABLEScope= PTHREAD_SCOPE_SYSTEMInherit scheduler = PTHREAD_INHERIT_SCHEDScheduling policy = SCHED_OTHERScheduling priority = 0Guard size= 4096 bytesStack address= 0x7f8ac216e000Stack size= 0x801000 byteslinux:/home/hsl/pthread # ./pattr.r 0x30000000posix_memalign() allocated at 0x7fe07d5e2000Thread attributes:Detach state= PTHREAD_CREATE_DETACHEDScope= PTHREAD_SCOPE_SYSTEMInherit scheduler = PTHREAD_EXPLICIT_SCHEDScheduling policy = SCHED_OTHERScheduling priority = 0Guard size= 0 bytesStack address= 0x7fe07d5e2000Stack size= 0x30000000 bytes 平时使用pthread_create()来创建的线程,其中的pthread_attr_t *attr参数一般来说使用NULL,也就是ptread_create()使用默认值来创建线程已经能满足大部分的使用。接受失败,是我们不常听到或看到的一个命题,我们大都接受的是正面的教育,

pthread 简要使用指南(五) 线程属性(pthread

相关文章:

你感兴趣的文章:

标签云: