线程创建

线程概念

典型的unix进程可以看成只有一个控制线程:一个进程只能做一件事。加入多线程后,一个进程能够做不止一件事,每个线程处理各自的独立任务。多线程的好处是:

  • 通过为每件事件类型分配单独的处理线程,可以简化处理异步事件的代码。
  • 多个进程必须使用系统提供的复杂机制才能实现内存和文件描述符的共享,而多个线程自动地可以访问相同的存储地址空间和文件描述符。
  • 有些问题可以分解从而提高整个系统的吞吐量。
  • 交互的程序同样可以通过使用多线程来改善响应时间,多线程可以把程序中处理用户输入输出的部分与其他部分分开

    每个线程都包含表示执行环境所必需的信息,其中包括表示线程的线程ID一组寄存器值栈,调度优先级和策略,信号屏蔽字,errno变量以及线程私有数据
    一个进程的所有信息对该进程的所有线程都是共享的,包括可执行程序代码,程序的全局内存和堆内存,栈以及文件描述符。

线程标识

线程ID在它所属的进程上下文中才有意义,用pthread_t数据类型来表示,实现是通过一个结构来表示的,所以不能把它当作整数处理。

//比较两个线程ID
int pthread_equal(pthread_t tid1, pthread_t tid2);
返回值:相等,返回非0值;否则返回0

线程可以通过调用pthread_self函数获得自身的线程ID

pthread_t pthread_self(void);
线程创建

线程的创建通过pthread_create函数创建

int pthread_create(pthread_t* restrict tidp,
                    const pthread_attr_t* restrict attr,
                    void* (*start_rtn)(void*),
                    void* restrict arg);
返回值:创建成功返回0;否则,返回错误编码

参数:
tidp:新创建的线程ID
attr:用于定制各种不同的线程属性,值为NULL时,具有默认的线程属性
start_rtn:新创建线程的开始运行地址
arg:一个无类型的参数;如果需要向start_rtn传递多于一个的参数时,可将多个参数放在一个结构中,然后将结构的地址作为arg参数传入

线程创建时不能保证那个线程会先运行,新创建的线程可以访问进程的地址空间,并且继承调用线程的浮点环境和信号屏蔽字,但是该线程的挂起信号集会被清除。

线程终止

单个线程可以通过3种方式退出:

  1. 线程可以简单地从启动例程中返回,返回值是线程的退出码。
  2. 线程可以被同一个进程中的其他线程取消
  3. 线程调用pthread_exit函数

线程退出时,线程本身可以调用pthread_exit(void* rval_pt)函数设置退出码
进程中的其他线程调用pthread_join(pthread_t tid, void** rval_ptr)获取线程的返回码;如果线程是被取消的,由人rval_ptr指定的内存单元就设置为PTHREAD_CANCEL

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值