线程及其用法

一、什么是线程?

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,但是可以与同属于一个进程的其他的线程共享进程拥有的全部资源。

说道线程那么就必须要了解进程,因为线程依赖进程的地址空间

那么进程的空间是什么样的呢?

 

进程空间:

     栈
     堆
   数据段
   代码段 

 

线程是在栈里面的地址空间;并且一个进程可以有多个线程,因为线程都是用的进程的地址空间,所以所有的线程可以共享进程的全部资源。

下面补充一个小知识点:

若当前进程的线程数小于CPU的个数,呢么系统可以保证每一个线程单独拥有一个CPU;

线程的创建:

#include <pthread.h>

int pthread_create(pthread_t   *threatd,   pthread_attr_t  *attr,  void  *(*start_routine)(void  *), void  *arg);

参数说明:

thread:指向pthread_t类型的指针,用于引用新创建的线程。
attr:用于设置线程的属性,一般不需要特殊的属性,所以可以简单地设置为NULL。
*(*start_routine)(void *):传递新线程所要执行的函数地址。
arg:新线程所要执行的函数的参数。
调用如果成功,则返回值是0,如果失败则返回错误代码。
与创建进程不同,创建线程时可以指定一个工作函数,新线程将从这个函数开始执行,函数返回也就等价于线程退出。
工作函数必须有一个(void *)型参数,新线程开始执行时,这个参数的值就是pthread_create函数的arg参数的值,因此可以利用它来向线程传递数据。
工作函数必须有(void *)型的返回值,它代表线程的退出状态。

线程ID获取:

include <pthread.h>
pthread_t pthread_self(void);
返回当前线程的ID


可以使用pthread_equal()函数检查两个线程ID是否相同
include <pthread.h>
int pthread_equal(pthread_t t1, pthread_t t2);
如果想相等则返回0  
 

线程终止:

#include <pthread.h>
void pthread_exit(void *retval);
参数说明:
retval:返回指针,指向线程向要返回的某个对象。
线程通过调用pthread_exit函数终止执行,并返回一个指向某对象的指针。注意:绝不能用它返回一个指向局部变量的指针,因为线程调用结束后,这个局部变量就不存在了,这将引起严重的程序漏洞。
 
调用pthread_exit()等价于在工作函数中执行return,区别是pthread_exit()可以在工作函数调用的任何函数中被调用。
如果主线程调用pthread_exit(),而不是exit()或执行return,则其他线程将继续执行。
 

线程等待:

#include <pthread.h>
int pthread_join(pthread_t th, void **thread_return);
参数说明:
th:将要等待的线程,线程通过pthread_create返回的标识符来指定。
thread_return:一个指针,指向另一个指针,而后者指向线程的返回值。不需要返回值则为NULL

线程分离:

#include <pthread.h>
int pthread_detach(pthread_t thread);
成功返回0。失败返回错误值
   
一个线程可以使用下面的方式分离自己:
   pthread_detach(pthread_self());
    pthread_detach()不会导致调用者阻塞,也不会导致所操作的线程结束。如果调用pthread_detach()时线程已经结束,则清理其所占用的资源。
 
对于创建时处于未分离状态的线程,必须调用一次pthread_join()或pthread_detach(),否则线程结束后就会留下没有释放的资源。

 

注意事项:

除了局部变量以外,所有其他变量都将在一个进程中的所有线程之间共享。
 

线程没有像进程那样的父子关系,仅有属于同一个进程的“同组”关系(进程实际上代表的是一个线程组)。
 

在POSIX线程模型中,主线程可以创建一个新线程A,新线程A又可以创建另一个新线程B,线程A和B本身没有父子关系,只是同属于一个进程。

 等待线程结束的pthread_join()操作可以由任何一个同组的线程发起,不必是主线程。另外,如果主线程退出,即进程退出,则所有的线程也会随之退出。  
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值