线程基本概念以及基本函数

线程

线程实际上也是进程的一种,只不过它是进程内部被执行的一部分,进程是为所有线程提供资源的,所以这两部分可造成资源竞争,对于线程而言,它的执行粒度比进程要细,并且对于线程来说,在一个进程里可以存在多个,多个线程也可以并行。

那么既然已经有进程了为什么还要提出线程的概念??

对于进程来说,它在某一时刻一个进程只能执行一个任务,当该任务执行完成之后才会执行下一个任务,那么对于操作系统来说是非常浪费资源和时间的。线程在同一个时刻可以多个同时进行处理异常事件以及执行任务等,不必再等待CPU去响应,并且线程强调的是资源共享,这样对于操作系统来说代价较小,并且切换的时候工作量减小了,因为资源共享。多线程可以改善响应时间与吞吐量。
特点:

线程是由线程创建的,但是其不具父子关系,属于对等关系  
编译时加上  -lpthread  线程属于库函数而不是系统接口


线程实现函数

线程创建:pthread_create(id,attr属性,无类型函数指针,无类型函数指针参数)
线程创建以后并不知道哪个线程会先被执行
线程等待:pthread_join(线程id , 输出型参数(等待那个线程的返回信息))
如果不等待那么线程造成的危害就是内存泄漏,与僵尸进程造成的结果一样
线程退出哪些情况:代码跑完  结果对/不对  -----不存在触发异常
主线程join,以阻塞方式等待,如果对线程返回值不感兴趣可以把输出型参数设为NULL
一旦新线程触发异常,那么整个进程就退出,主线程等待不到
进程不能获得主线程退出码
获得线程自身id:pthread_self() 
线程终止:pthread_exit(void * ret)      -----ret是个无类型的指针,
线程取消pthread_cancel(id)    可以取消同一进程中的其他线程
线程销毁:pthread_destroy(id)
线程分离:pthread_detach(id)----线程被分离后,不能使用join去等待该进程。

线程同步与互斥
当多个线程共享一块内存时,需要确保这块内存里的数据和每个线程看到的数据 是一样的,也就是一致性问题。当变量存在修改时,需要对线程进行同步。
线程同步需要加锁实现,即只允许一个线程访问临界资源,在此期间,其他线程不得访问该段资源。
引入互斥量来确保同一时间数据只有一个线程访问。互斥量可以认为就是一把锁,在访问资源前进行上锁,这样其他线程就不能访问该资源,访问完成之后进行解锁,确保其他线程能够正确访问该段资源。
互斥量实现函数
互斥量类型为pthread_mutex_t    mutex
初始化互斥量:pthread_mutex_init(&mutex , atr)----当初始化时,如果使用默认的属性一般把第二个参数设为NULL
销毁互斥量:pthread_mutex_destroy(&mutex)----------参数直接填写定义的那个互斥量上锁 
上锁互斥量:pthread_mutex_lock(&mutex)
解锁互斥量:pthread_mutex_unlock(&mutex)

避免互斥量上锁时产生死锁:
如果一个互斥量被连续上锁两次就会产生死锁,因为满足了死锁的条件
该死锁产生是可以避免的,因为可能是由于上锁的顺序不当而产生死锁,那么尽量在上锁时仔细检查上锁顺序即可。

猜你喜欢

转载自blog.csdn.net/qq_36474990/article/details/80260693