1.创建一个新线程
1.1函数原型
int pthread_creat(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
1.2参数
- thread:返回新创建的线程ID
- attr:设置线程的属性,attr为NULL表示使用默认属性
- start_routine:线程启动后要执行的函数地址
- arg:传给线程启动函数的参数
1.3返回值
成功返回0,失败返回错误码。
- 传统的一些函数成功返回0,失败返回-1,并且对全局变量errno赋值以指示错误类型。
- pthreads函数出错时不会设置全局变量errno,而是将错误代码通过返回值返回。
- pthreads同样也提供了线程内瑞典errno变量,以支持其他使用errno的代码。对于pthreads函数的错误,建议通过返回值判定,因为读取返回值要比读取线程内的errno变量的开销更小。
2.线程终止
2.1 函数原型
void pthread_exit(void *value_ptr);
2.2 参数
- value_ptr:value_ptr不要指向一个局部变量
2.3 返回值
无返回值,跟进程一样,线程结束的时候无法返回到它的调用者(自身)
3. 等待线程结束
3.1 函数原型
int pthread_join(pthread_t thread, void **value_ptr);
3.2 参数
- thread,线程ID
- value_ptr,它指向一个指针,后者指向线程的返回值
3.3 返回值
成功返回0,失败返回错误码。
4. 返回线程ID
4.1 函数原型
pthread_t pthread_self(void);
4.2 返回值
成功返回线程ID
5. 取消一个执行中的线程
5.1 函数原型
int pthread_cancel(pthread_t thread);
5.2 参数
- 线程ID
5.3 返回值
成功返回0,失败返回错误码
6. 初始化与销毁属性
6.1 函数原型
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
7. 获取与设置分离属性
7.1 函数原型
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
PTHREAD_CREAT_DETACHED
PTHREAD_CREAT_JOINABLE
8. 获取与设置栈大小
8.1 函数原型
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
9. 获取与设置栈溢出保护区大小
9.1 函数原型
int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
int pthread_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);
10. 获取与设置线程竞争范围
10.1 函数原型
int pthread_attr_getscope(pthread_attr_t *attr, int *contentionscope);
int pthread_attr_setscope(pthread_attr_t *attr, int contentionscope);
PTHREAD_SCOPE_PROCESS
PTHREAD_SCOPE_SYSTEM
11. 获取与设置调度策略
11.1 函数原型
int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
int pthread_attr_setschedpolicy(const pthread_attr_t *attr, int policy);
SCHED_FIFO,线程优先级相同,先进先出
SCHED_RR,线程优先级相同,后进线程可抢占先进的线程
SCHED_OTHER
12. 获取与设置继承的调度策略
12.1 函数原型
int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inheritsched);
int pthread_attr_setinheritsched(const pthread_attr_t *attr, int inheritsched);
PTHREAD_INHERIT_SCHED,继承调用者线程调度策略属性
PTHREAD_EXPLICIT_SCHED,自己设置调度策略属性
13. 获取与设置调度参数
13.1 函数原型
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);
int pthread_attr_setschedparam(const pthread_attr_t *attr, struct sched_param param);
14. 获取与设置并发级别
14.1 函数原型
int pthread_setconcurrency(int new_level);
int pthread_getconcurrency(void);
仅在N:M线程模型中有效,设置并发级别,给内核一个提示:表示提供给定级别数量的核心线程来映射用户线程是高效的。
15. 线程特定数据
- 在单线程程序中,我们经常要用到“全局变量”以实现多个函数间共享数据
- 在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有
- 但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却可以跨多个函数访问
- POSIX线程库通过维护一定的数据结构来解决这个问题,这个数据称为TSD(Thread-specific Data)
每个线程具有1-128个以key-value形式存储线程特定数据
15.1 函数原型
int pthread_key_creat(pthread_key_t *key, void(*destructor)(void*));
int pthread_key_delete(pthread_key_t);
void *pthread_getspecific(pthread_key_t key);
int pthread_setspecific(pthread_key_t key, const void *value);
int pthread_once(pthread_once_t *once_control, void (*init_routine)(void));
pthread_once_t once_control = PTHREAD_ONCE_INIT;