设为首页 加入收藏

TOP

C++学习之线程的概念、创建以及使用实例(一)
2018-05-21 15:48:11 】 浏览:322
Tags:习之 线程 概念 创建 以及 使用 实例

线程的概念

线程是执行的基本单位。每个进程至少有一个线程。

一个进程里可以存在多个线程,多个线程共享一个进程的资源。

共享的资源包括数据段、代码段和堆中的内容。

而线程私有的部分,在栈帧。每个线程拥有自己的栈帧,栈帧内的资源是线程私有的。

线程有自己的tid和自己的tcb。

创建线程

操作系统向用户提供了创建线程的库函数:

Compile and link with -pthread
#include 
  
   
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
功能:创建一个新的线程
参数:
thread:用于存储线程的tid
attr:NULL,不涉及线程的属性
start_routine:线程执行的函数
arg:指定了传递给线程执行函数的唯一参数
返回值:
success:0
error:返回错误码,thread参数的内容不确定

获取线程自己的tid
pthread_t pthread_self(void);
Compile and link with -pthread.
  

线程的终止,汇合,分离

1、在线程函数中的return,会终止线程

2、在线程执行过程中不要使用exit(3),会结束当前进程。

3、可以使用pthread_exit(3),结束线程自己

4、pthread_cancel,取消一个线程

#include 
  
   
void pthread_exit(void *retval);
Compile and link with -pthread.
功能:终止当前线程
参数:
retval:通过retval返回一个值,给进程中的另外一个线程使用,调用用了pthread_join(3)
返回值:
这个函数不返回给调用者
----------------------------------------------------------------------------
int pthread_cancel(pthread_t thread);
功能:给一个线程发送取消请求
参数:
thread:指定了接受请求的线程的id
返回值:
success:0
error:not0 

注意:如果线程已经被取消,另外调用pthread_join的线程,获取到的是PTHREAD_CANCELED
  

一个线程执行结束,如果没有其他线程为它回收资源,那么这些资源就会一直被占用,直到进程结束,由系统回收。

通常一个服务程序运行起来是不会停止的,大量的僵尸线程,会导致内存泄漏。

操作系统提供了两种回收机制:

1、由其他线程来为消亡的线程回收资源。

其他线程通过一个库函数,等待需要被回收的线程消亡。如果其他线程在需要被回收的线程消亡前执行到等待函数,就会进入阻塞等待状态,直到需要被回收的线程消亡,然后回收资源,并接触阻塞,继续向下执行。这种方式叫做线程的汇合。

int pthread_join(pthread_t thread, void **retval);
功能:汇合一个终止的线程
参数:
thread:指定了要汇合的线程的id
retcal:指定了存放线程退出状态码的地址
返回值:
success:0
error:返回错误编号

2、由操作系统为消亡的线程回收资源。

其他线程通过一个库函数,告诉操作系统需要回收资源的线程将由系统执行回收动作。需要回收资源的线程在结束之后,就会被系统回收。且其他线程不会产生阻塞状态。

int pthread_detach(pthread_t thread);
功能:分离一个线程
参数:
thread:指定了要分离的线程的id
返回值:
success:0
error:返回一个错误编号

线程的同步

线程的同部分为两种。

第一种:由于争抢资源而被迫同步

线程是异步的,且都是可以访问进程的公共资源,数据段、代码段、堆。如果两个线程同时访问一个全局变量,会出现不稳定的结果。为了保证数据的有效性,需要在线程准备访问公共资源之前占有和这个全局变量对应(这种讲法是不严谨的,一个资源和一把mutex锁的对应,是由主观决定的,并没有实际的联系)的mutex锁。对于mutex锁的操作如下:

#include 
  
   
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//静态初始化一个mutex锁
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
功能:
参数:
mutex:指定要初始化的mutex
attr:NULL
返回值:
success:0
error:错误码
-------------------------------------------------------------------------------------------------

int pthread_mutex_destroy(pthread_mutex_t *mutex);
功能:销毁mutex锁
参数:
mutex:指定要销毁的mutex锁
返回值:
success:0
error:错误码
-------------------------------------------------------------------------------------------------

int pthread_mutex_lock(pthread_mutex_t *mutex);
功能:加锁,如果锁被其他线程占用,阻塞等待。加锁成功,当前线程成为这把锁的拥有者
参数:
mutex:指定要使用的锁
返回值:
success:0
error:错误码
-------------------------------------------------------------------------------------------------

int pthread_mutex_trylock(pthread_mutex_t *mutex);
功能:和上个函数一样,但是在锁被其他线程占用的时候,立即返回,返回错误
参数:
mutex:指定要使用的锁
返回值:
success:0
error:错误码
-------------------------------------------------------------------------------------------------

int pthread_mutex_unlock(pthread_mutex_t *mutex);
功能:释放一把锁。在其他阻塞等待获取这把锁的线程,从中选择其一获取这把锁
参数:
mutex:指定要释放的锁
返回值:
success:0
error:错误码

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇关于c++中与的容器(运算符的重载.. 下一篇C++ 类的前向声明、不完全类型和..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目