一、线程标识

每个线程有一个线程ID,线程ID用pthread_t类型表示,可移植操作系统一般不能把它作为整数处理。

Linux下的pthread,一般的实现是:
进程ID: pid_t pid; //pid_t: unsigned int
线程ID:pthread_t tid; //pthread_t: unsigned long int

线程ID比较:
#include<pthread.h>
int pthread_equal(pthead_t t1, pthread_t t2);

获取自身线程ID:
#include<pthread.h>
pthread_t pthread_self(void);
二、线程创建
#inlude<pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t attr, void(start_routine)(void), void *arg);

thread:出参, 返回线程号;
attr:线程属性,一般是NULL;
start_routine: 线程的运行函数实体;
arg: 线程的运行函数入参;

三、线程终止
进程中任一线程调用了exit,_Exit或_exit则整个进程都会终止,类似的,如果信号的默认动作是终止进程,那么,把该信号发送到线程也会终止整个进程。
单个线程退出有三种方式:
(1)、线程只是从启动例程中返回,返回值是线程的退出码;
(2)、线程可以被同一进程中其他线程取消;
(3)、线程调用pthread_exit;

#include<pthread.h>
void pthread_exit(void *retval);
int pthread_join(pthread_t thread, void **retval);
pthread_join用来等待线程的终止,调用线程将一直阻塞,直到线程调用pthread_exit、从启动例程返回或被取消。

四、线程创建
#include <pthread.h>
int pthread_cancel(pthread_t thread);
pthread_cancel函数用来取消同一进程中其他线程。默认情况下制定的tid线程相当于调用了参数为PTHREAD_CANCELED的pthread_exit函数;该函数仅发送取消请求,线程可以选择忽略取消方法或者控制取消方式;

#include<pthread.h>
int pthread_detach(pthread_t thread);
pthread_detach函数可以使线程进入分离状态,分离状态时,线程的底层存储资源可以在线程终止时立即被收回,且不能用pthread_join函数等待它的终止。

五、线程同步
竞争条件与临界区:
多个线程同时访问同一个资源且结果与线程访问资源时的顺序有关的这样一种情形就叫竞争条件。
临界区指一个访问共同资源的程序片段。

互斥量:通过使用pthread的互斥接口保护数据,确保同一时间只有一个线程访问数据。互斥量本质上是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁后,任何其他试图再次对互斥量加锁的线程将会被阻塞直至当前线程释放该互斥锁。互斥量初始化:互斥量使用前需要先初始化,可以初始化为常量PTHREAD_MUTEX_INITIALIZER(只对静态分配的互斥量);也可以通过调用pthread_mutex_init函数初始化,如果动态分配互斥量,释放内存前需要调用:pthread_mutex_destory#include<pthread.h>int pthread_mutex_destory(pthread_mutex_t *mutex);int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;加锁与释放锁:#include<pthread.h>int pthread_mutex_lock(pthread_mutex_t *mutex);int pthread_mutex_trylock(pthread_mutex_t *mutex);int pthread_mutex_unlock(pthread_mutex_t *mutex);int pthread_mutex_timedlock(pthread_mutex_t *mutex);其中,如果互斥量已经上锁,则调用pthread_mutex_lock会阻塞直到互斥量解锁,如果不希望阻塞,则使用pthread_mutex_trylock,当互斥量未上锁则加锁,已加锁则出错返回EBUSY。死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,他们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程或线程称为死锁进程或线程。产生死锁的四个必要条件:A\ 互斥条件:一个资源每次只能被一个进程或线程使用。B\ 请求与保持条件:一个进程或线程因请求资源而阻塞时,对已获得的资源保持不放。C\ 不剥夺条件:此进程或线程已获得的资源,在未使用完之前,不能强行剥夺。D\ 循环等待条件:多个进程或线程之间形成一种头尾相接的循环等待资源关系。读写锁:读写锁与互斥量类似,不过读写锁允许更高的并行性。互斥量要么是加锁状态,要么是不加锁状态。而读写锁有三种状态:读模式加锁状态、写模式加锁状态、不加锁状态。一次只有一个线程可以占有写模式的读写锁,但多个线程可以同时占有读模式的读写锁。读写锁是写加锁状态时,在这个锁解锁之前,所有试图对这个锁加锁的线程都会被阻塞。当读写锁在读加锁状态时,所有试图以读模式对它进行加锁的线程都可以得到访问权,但是如果线程希望以写模式对此锁加锁,它必须阻塞直到所有的线程释放读锁。一句话:当有线程要写的时候,谁都不能读;当有线程读的时候,大家都可以读,但是谁都不能写;适用于读的次数远大于写的次数的情况;#include<pthread.h>int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);条件变量:条件变量与互斥量一起使用时,允许线程以五竞争的方式等待特定的条件发生。而条件变量本身需要互斥量保护,线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种变化,因此必须锁住互斥量以后才能计算条件。#include<pthread.h>int pthread_cond_int(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);int pthread_cond_destroy(pthread_cond_t *cond);pthread_cond_t cond = PTHREAD_COND_INITIALIZER;int pthread_cond_timedwait(pthreadc_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);int pthread_cond_signalint pthread_cond_broadcast

【项目经验】之线程基本知识相关推荐

  1. 没有项目经验找工作处处碰壁怎么办

    最近很多马上要毕业的同学遇到了一些问题: 我马上就要毕业了没有开发经验怎么办? 我投递了 N 多公司全部没有给工作机会,有的给了面试机会也是没有下文了怎么办? 我简历上什么东西都没有,要不要伪造一个工 ...

  2. 国内程序员的评估标准,是更注重项目经验、代码质量还是基础知识?又或者两者比例五五开?

    正好前两天给项目组面试了一个初级Android和高级Android的工程师 作为负责人,我也是从技术菜鸟过来的,也不会像其他面试官那样弄一些虚的东西,不会让他们做一些笔试题题,更不会让求职者上机去敲代 ...

  3. 面试Java后端开发的感受:如果就以平时项目经验来面试,通过估计很难——再论面试前的准备...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:hsm_computer 链接:https://www.cn ...

  4. 还发愁项目经验吗?基于Netty实现分布式RPC框架[附完整代码]

    写给大家的话 最近我收到很多读者的来信,对如何学习分布式.如何进行项目实践和提高编程能力,存在很多疑问. 分布式那么难,怎么学?为什么看了那么多书还是掌握不了? 开源的框架比如Dubbo代码太多了,完 ...

  5. 项目经验不丰富、技术不突出的程序员怎么打动面试官?

    前言 相信不少的程序员都有过类似的困惑:如果我没有大型的项目经历,也不能靠技术征服面试官,那我要怎么才能给面试官留下一个好印象呢? 按照本人的面试经验来说,面试主要看几点:项目经验+基本技术+个人潜力 ...

  6. 零架构项目经验的程序员,如何升级成架构师

    先说目前关于架构师的一些是实际情况. 1 要成为Java架构师,单纯靠学知识一定不行,得靠在项目里积累经验. 2 如何判断程序员是否已经成为java架构师?不是看程序员掌握的技能,更不是看程序员干的活 ...

  7. 面试中更多会考核相关技能的项目经验——再论程序员该如何准备面试

    在如何准备Java面试?如何把面试官的提问引导到自己准备好的范围内?这篇博文后,提到了不少引导的说辞和技巧,如果能把面试官的提问引导到事先准备好的亮点上,一方面确实可以更有效地耗费面试时间,另一方面也 ...

  8. 培训班出身需隐瞒经历吗?商业项目经验怎样写?程序员面试准备大盘点

    作者 | hsm_computer 责编 | 伍杏玲 出品 | CSDN博客 在<春招妥了!资深技术面试官教你这样准备 Java 面试!>这篇博文后,提到了不少引导的说辞和技巧,如果能把面 ...

  9. 这是在下写的一些小小的项目经验和项目需求

    项目经验 健身馆管理系统 系统介绍:该系统分为用户管理,公告设计,课程模块,场地器械管理,员工管理等功能模块,用户主要有管理员和会员,公告模块有增删查改及附件的上传及其审核,课程同样也有增删查改等功能 ...

  10. 十年项目经验面试官亲传大数据面试__大数据面试独孤九剑

    文章目录 引言 第一剑「总决式」功能概述(三句话左右概况,简明扼要) 第二剑「破剑式」项目周期(开发时长和人员配置) 开发时长: 人员配置 第三剑「破刀式」技术架构(技术选项及框架版本) 第四剑「破枪 ...

最新文章

  1. DOM笔记(五):JavaScript的常见事件和Ajax小结
  2. 7 papers | NeurIPS 2019获奖论文;OpenAI刀塔2论文公布
  3. slim.flatten——将输入扁平化但保留batch_size,假设第一维是batch
  4. 面向对象写选项卡、拖拽
  5. 微软开源基于.NET Core的量子开发工具包 QDK
  6. 浙江高级会计师评审计算机要求,浙江2020年高级会计师评审申报论文要求
  7. Python数据分析学习笔记03:NumPy基础(数组与向量化计算)
  8. oa系统服务器数据库,oa数据库和服务器
  9. 2023南京航空航天大学计算机考研信息汇总
  10. AWS Landing Zone Solution
  11. 爸妈上班却顶着凛冽的寒风骑着自行车
  12. Compensating-Transaction模式
  13. vue3循环遍历图片渲染无效果
  14. 【深度学习】2-模型在测试集的准确率大于训练集
  15. 机器人模型导入MATLAB(一):导入Simscape 1G/2G
  16. Autodesk全系列下载,Autodesk全版本下载
  17. Python VTK计算曲面的高斯曲率和平均曲率
  18. 时间复杂度 ( 递归实现阶乘、斐波那契数列第n个数) / 空间复杂度
  19. Spring MVC分析篇——HandleMapping
  20. 获国际权威认可 | 云扩科技入选《RPA全球市场格局报告,Q3 2022》

热门文章

  1. 2019新悦动打火困难解决了吗_悦动大面积存在启动困难北京现代检查不出原因就换零件...
  2. arm linux samba,嵌入式linux系统教你制作samba服务器
  3. 串口 接收端_嵌入式系统串口传输int float型数据的处理
  4. ResourceBundle国际化
  5. mysql 行转列 显示_mysql 行转列 (结果集以坐标显示)
  6. Provisional headers are shown问题
  7. mysql一次运行多个SQL文件
  8. SpringBoot注解@Value取值取不到问题
  9. ORACLE 索引的三种状态: VALID、 N/A 、UNUSABLE
  10. Linux下安装Apache Maven安装