本文共 2344 字,大约阅读时间需要 7 分钟。
创建POSIX线程的函数为:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
第1个参数为线程句柄(类似于文件描述符),第3个参数为线程启动函数(输入void*、返回void*,因为指向任何结构体/基本数据类型的指针都可以被看作void*),第4个参数为传递给线程启动函数的参数。
第2个参数一般设置为NULL,此时采用默认的线程属性,但有需求时仍需设置线程属性。线程属性的设置需要谨慎操作,使用后需及时销毁。
以下是一个使用线程属性设置的示例:
// thread_attrib.c: 线程属性使用示例// 编译方式: gcc thread_attrib.c -pthread#include#include #include #include #include static inline void checkErrnum(int errnum, const char* msg) { if (errnum != 0) { fprintf(stderr, "%s error: %s\n", msg, strerror(errnum)); exit(1); }}static inline void* threadFunc(void* arg) { printf("%s\n", (char*) arg); return NULL;}int main() { int s; // 错误码 // 初始化线程属性 pthread_attr_t attr; s = pthread_attr_init(&attr); checkErrnum(s, "pthread_attr_init"); // 设置线程分离状态 s = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); checkErrnum(s, "pthread_attr_setdetachstate"); // 创建线程 pthread_t tid; s = pthread_create(&tid, &attr, threadFunc, (void*) "Hello world!"); checkErrnum(s, "pthread_create"); // 销毁线程属性 s = pthread_attr_destroy(&attr); checkErrnum(s, "pthread_attr_destroy"); sleep(1); // main线程休眠,确保threadFunc函数能够执行完毕 return 0;}
需要注意的有:
线程属性的设置涉及多个方面:
以下是线程属性相关函数的示例:
// Detach stateenum { PTHREAD_CREATE_JOINABLE, PTHREAD_CREATE_DETACHED};// Stack size and addressint pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);// Scheduler policyint pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);// Inheritance modeenum { PTHREAD_INHERIT_SCHED, PTHREAD_EXPLICIT_SCHED};// Scope handlingenum { PTHREAD_SCOPE_SYSTEM, PTHREAD_SCOPE_PROCESS};
通过合理设置线程属性,可以优化线程的行为和资源使用效率。
转载地址:http://qpkfk.baihongyu.com/