- 博客(77)
- 收藏
- 关注
原创 Linux系统编程21.线程同步_信号量
信号量: 可以应用于线程、进程间同步。 相当于初始化为 N 的互斥量。 注意:信号和信号量没什么关系 N值,表示可以同时访问共享数据区的线程数。 函数: sem_t sem; 定义类型。 int sem_init(sem_t*sem,int pshared,unsigned int value); 参数: sem:信号量 pshared: 0:用于线程间同步 1:用于进程间同步 value:N值。...
2020-03-10 10:24:48
195
原创 Linux系统编程20.线程同步_条件变量
条件变量: 本身不是锁! 但是通常结合锁来使用(mutex)。 pthread_cond_t cond; 初始化条件变量: 1.pthread_cond_init(&cond,NULL); 动态初始化 2.pthread_cond_t cond=PTHREAD_COND_INITIALIZER; 静态初始化 阻塞等待条件: pthread_cond_wait(&cond,&...
2020-03-10 10:24:13
195
原创 Linux系统编程19.线程同步_锁
线程同步概念: 线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回,同时其它线程为保证数据一致性,不能调用该功能。 协同步调,对公共区域数据按序访问。防止数据混乱,产生与时间有关的错误。 锁的使用: 建议锁!对公共数据进行保护。所以线程【应该】在访问公共数据前先拿锁再访问。但,锁本身不具备强制性。 使用mutex(互斥量、互斥锁)一般步骤: 1.pthread_mutex_t...
2020-03-10 10:23:35
181
原创 Linux系统编程18.线程使用注意事项
线程使用注意事项: 1.主线程退出其他线程不退出,主线程应调用pthread_exit 2.避免僵尸线程 pthread_join pthread_detach pthread_create指定分离属性 被join线程可能在join函数返回前就释放完自己的所有内存资源,所以不应当返回被回收线程栈中的值; 3.malloc和mmap申请的内存可以被其他线程释放 4.应避免在多线程模型中调用fork,...
2020-03-10 10:22:47
266
原创 Linux系统编程17.线程属性
线程属性: 设置分离属性。 pthread_attr_t attr 创建一个线程属性结构体变量 pthread_attr_init(&attr) 初始化线程属性 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) 设置线程属性为分离态 pthread_create(&tid,&attr,tfn,N...
2020-03-10 10:22:15
123
原创 Linux系统编程16.进程控制原语与线程控制原语对比
线程控制原语 进程控制原语 pthread_create(); fork(); pthread_self(); getpid(); pthread_exit(); exit(); /return pthread_join(); wait()/waitpid(); pthread_cancel; kill(); pt...
2020-03-10 10:21:43
173
原创 Linux系统编程15.线程
线程概念: 进程:有独立的进程地址空间。有独立的pcb。 线程:有独立的pcb。没有独立的进程地址空间。 在Linux下: 线程:最小的执行单位 进程:最小分配资源单位,可看成是只有一个线程的进程 ps -Lf进程id -->线程号。LWP-->cpu执行的最小单位。 线程共享资源 1.文件描述符 2.每种信号的处理方式 3.当前工作目录 4.用户ID和组ID 5.内存地址空间 (....
2020-03-10 10:20:53
141
原创 Linux系统编程14.守护进程
守护进程 Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。不受用户登陆注销影响。 Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登陆、注销的影响。一直在运行着。他们都是守护进程。如:预读入缓输出的机制的实现;ftp服务器;nfs服务器等。 创建守护进程,最关键的一步是调...
2020-03-10 08:55:43
118
原创 Linux系统编程13.信号
信号共性: 简单、不能携带大量信息、满足条件才发送。 信号的特质: 信号是软件层面上的 “中断” 。一旦信号产生,无论程序执行到什么位置,必须立即停止运行,处理信号,处理结束,再继续执行后续指令。 所有信号的产生和处理全部都是由【内核】完成的。 信号相关概念: 产生信号: 1.按键产生 2.系统调用产生 3.硬件异常产生 4.命令产生 概念: 未决:产生与抵达之间状态。 抵达:产生并且送达到进程。...
2020-03-10 08:54:11
170
原创 Linux系统编程12.存储映射
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);创建共享影射区 参数: addr: 指定映射区的首地址。通常传NULL,表示让系统自动分配 length: 共享内存映射区大小。(<=文件的实际大小) prot: 共享内存映射区的读写属性。PROT_READ、PROT_WRITE、...
2020-03-10 08:53:09
179
原创 Linux系统编程11.管道
管道: 实现原理:内核借助环形队列机制,使用内核缓冲区实现。 特质: 1.伪文件 2.管道中的数据只能一次读取 3.数据在管道中,只能单向流动 局限性: 1.自己写,不能自己读 2.数据不可以反复读 3.半双工通信 4.血缘关系进程间可用 pipe函数: 创建、并打开管道 int pipe(int fd[2]) 参数: fd[0]:读端 fd[1]:写端 返回值: 成功:0 失败:-1 管道读写行...
2020-03-09 18:34:19
185
原创 Linux系统编程10.进程间通信的常见方式
如今常用的进程间通信方式有: (1)管道(使用最简单) (2)信号(开销最小) (3)共享映射区(无血缘关系) (4)本地套结字(最稳定)
2020-03-09 18:32:28
155
原创 Linux系统编程8.waitpid函数
一次wait/waitpid函数调用,只能回收一个子进程 waitpid函数:指定某一个进程进行回收。也可以设置非阻塞。waitpid(-1,&status,0)==wait(&status); pid_t waitpid(pid_t pid,int*status,int optains) 返回值: >0:表示回收的子进程pid 0:函数调用时,参3指定了WNOHANG,并且...
2020-03-09 18:31:19
237
原创 Linux系统编程7.wait回收子进程
wait函数: 回收子进程退出资源 阻塞回收任意一个 pid_t wait(int*status) 参数:(传出)回收进程的状态。 返回值: 成功:回收进程的pid; 失败:-1,errno 函数作用1: 阻塞等待子进程退出 函数作用2: 清理进程残留在内核的pcb资源 函数作用3: 通过传出参数,得到子进程结束状态 获取子进程正常终止值: WIFEXITED(status)-->为真...
2020-03-09 18:30:47
135
原创 Linux系统编程6.孤儿进程和僵尸进程
孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init 进程领养孤儿进程。 僵尸进程: 进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程。 特别注意:僵尸进程是不能使用kill命令清除掉的。因为kill命令只是用来终止进程的,而僵尸进程 已经终止。 ...
2020-03-09 18:30:06
107
原创 Linux系统编程5.exec函数族
将当前进程的.text、.data替换成为所要加载的程序的.text、.data,然后让进程从新的 .text第一条指令开始执行,但进程ID不变,换核不换壳。 exec函数族: 使进程执行某一程序。成功无返回值,失败返回-1 int execlp(const charfile,const chararg,…) 借助PATH环境变量找寻执行程序 参1:程序名 参2:argv() 参3:argv1 ...
2020-03-09 18:29:34
121
原创 Linux系统编程4.gdb父子进程调试
gdb调试 使用gdb调试的时候,gdb只能跟踪一个进程。可以在fork函数调用之前,通过指令设置 gdb调试工具跟踪父进程或者跟踪子进程。默认跟踪父进程。 set follow-fork-mode child 命令设置gdb在fork之后跟踪子进程。 set follow-fork-mode parent 设置跟踪父进程。 注意:一定要在fork函数调用之前设置才有效。 ...
2020-03-09 18:29:02
164
原创 Linux系统编程3.进程相关
进程: 程序:死的。只占用磁盘空间。–剧本 进程:活的。运行起来的程序,占用内存、cpu等系统资源。–戏 PCB进程控制块:是一个结构体 包含: 进程id 文件描述符表 进程状态:初始态、就绪态、运行态、挂起态、终止态; 进程工作目录位置 *umask掩码 信号相关信息资源 用户id和组id fork函数: pid_t fork(void) 创建子进程。父子进程各自返回进程pid。子进程返回0; ...
2020-03-09 18:28:40
117
原创 Linux系统编程2.目录项和inode
inode 其本质是结构体,存储文件的属性信息。如:权限,类型,大小,时间,用户,盘快位置 等,也叫做文件属性管理结构,大多数的inode都存储在磁盘上。 少量使用,近期使用的inode会缓存到内存中。 dentry 目录项,其本质依然是结构体,重要成员变量有两个 {文件名,inode,…}, 而文件内容 (data)保存在磁盘盘块中。 ...
2020-03-09 18:27:40
438
原创 Linux系统编程1.传入传出参数
传入参数: 1. 指针作为函数参数; 2. 通常有const关键字修饰; 3. 指针指向有效区域,在函数内部做读操作; 传出参数: 1. 指针作为函数参数; 2. 在函数调用之前,指针指向的空间可以无意义,但必须有效; 3. 在函数内部做写操作; 4. 函数调用结束之后,充当函数返回值; 传入传出参数: 1. 指针作为函数参数; 2. 在函数调用之前,指针指向的空间有实际意义; 3. 在函数内部,...
2020-03-09 18:17:25
305
原创 20题表示数值的字符串
表示数值的字符串 题目描述: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。 思路:以e或者E分割判断(+.1也是符合的) 代码: class Solution { public: bool i...
2020-01-13 18:30:17
102
原创 数组中重复的数字
数组中重复的数字 题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 思路:由于数组中数的范围为0到n-1,所以当用某个数组值做下标时数组不会越界。当数组下标与数组相同时,...
2020-01-11 21:00:49
115
原创 把字符串转成整数
把字符串转成整数 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 代码: class Solution { public: int StrToInt(string str) { if (str.empty())return 0; long long sum = 0; int i = 0,flag=0; if (...
2020-01-11 20:08:01
81
原创 61题扑克牌中的顺子
扑克牌中的顺子 题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K...
2020-01-10 21:27:45
159
原创 62题圆圈中最后剩下的数字
圆圈中最后剩下的数字 题目描述: 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…...
2020-01-09 22:36:43
293
原创 和为s的连续正数序列
和为s的连续正数序列 题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出所有和为S的连续...
2020-01-09 11:32:15
130
原创 矩形覆盖
矩形覆盖 题目描述: 我们可以用2乘1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2乘1的小矩形无重叠地覆盖一个2乘n的大矩形,总共有多少种方法? 思路:2乘1的小矩形去覆盖2乘n的大矩形,当小矩形横着放时,则必有下面的或者下面的小矩形横着放,所以最后一步填充时,要么从n-2步 横着放两个,要么从n-1步竖着放 一个;可以采用动态规划; 代码: class Solution { public:...
2020-01-07 17:39:49
156
原创 变态跳台阶
变态跳台阶 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 思路:使用动态规划(也可以不用),先找到规律,直接看最后一步,可以从任何位置跳到目的地,就是前面所有和加1。然后再进行化简。 代码: class Solution { public: int jumpFloorII(int number) { if (n...
2020-01-06 18:06:13
135
原创 青蛙跳台阶
青蛙跳台阶 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 思路:使用动态规划,到达最后一步之前,只有两种可能,前面两阶或者一阶,所以可以得出状态转移方程 代码: class Solution { public: int jumpFloor(int number) { if (number == 0)ret...
2020-01-06 17:18:51
147
原创 10题斐波那契数列
斐波那契数列 题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39 思路1:采用动态规划 代码: int Fibonacci(int n) { if (n == 0)return 0; vector<int>dp(n + 1, 0); dp[1] = 1; dp[2] = 1; for (int i...
2020-01-06 16:50:10
515
原创 11题旋转数组的最小数字
旋转数组的最小数字 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 思路:采用二分查找法可以降低复杂度,但是要考虑特别情况,例如旋转的个数为0,那么最小值就...
2020-01-06 15:36:34
96
原创 9题两个栈实现队列
两个栈实现队列 题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 代码: class Solution { public: void push(int node) { stack1.push(node); } int pop() { if (stack1.empty() && stack2.empty()){ t...
2020-01-06 11:54:26
107
原创 59题滑动窗口的最大值
滑动窗口的最大值 题目描述: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[...
2020-01-06 11:22:19
198
原创 6题从尾到头打印链表
从尾到头打印链表 题目描述: 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 思路一:反转链表,但是也改变了原链表的结构 vector<int> printListFromTailToHead(ListNode* head) { vector<int>result; if (head == nullptr)return result; ListNode...
2020-01-06 11:20:51
127
原创 65题不用加减乘除做加法
不用加减乘除做加法 题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 思路:采用位运算,首先求两数的异或值,异或值代表着不产生进位的两数和,然后再求两数相与值,相与左移一位代表着两数相加产生进位的值。以此循环,直到相与的值为0。 代码: class Solution { public: int Add(int num1, int num2) { in...
2020-01-06 10:34:09
155
原创 64题求1+2+3+...+n
求1+2+3+…+n 题目描述: 求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 思路1:使用构造函数加静态变量法 class Solution { public: Solution() { ++N; Sum += N; }; static unsigned getSum(){ return Sum; ...
2020-01-05 23:00:45
196
原创 58题翻转字符串
翻转字符串 题目描述: 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? 思路: (...
2020-01-03 10:56:24
153
原创 57题和为s的两个数字
和为s的两个数字 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 思路:采用双指针从两头遍历 class Solution { public: vector<int> FindNumbersWithSum(vector<int> array, int sum) { vector<...
2020-01-02 11:00:02
90
原创 56题数组中只出现一次的数字
数组中只出现一次的数字 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 思路: (1)使用map容器,空间复杂度较高 (2)使用位运算,将数组中所有的数异或之后,结果就是这两个数的异或值,然后找到该值为1的一位,按照在相同位上是否为1,将数组分为两部分,而要求的两个值就分别在这两组中,分别异或就可以得出。 代码: //map容器的方法 vo...
2019-12-31 16:01:47
102
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅