线程基本函数原型

本文详细介绍了POSIX线程(pthread)的创建、终止、同步与通信操作,包括线程创建函数pthread_create,线程退出pthread_exit,线程等待pthread_join,获取线程IDpthread_self,线程取消pthread_cancel,以及线程属性设置如栈大小、分离属性等。此外,还涉及线程特定数据的使用,确保多线程环境下数据的安全隔离。
摘要由CSDN通过智能技术生成

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;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值