自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 资源 (1)
  • 收藏
  • 关注

原创 Linux 之 守护进程

Linux 之 守护进程正文Daemon进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件创建守护进程1.父进程创建子进程后父进程结束。2.子进程创建新会话。3.子进程改变当前目录为根目录。4.子进程改变umask。5.子进程将STDIN_FILENO ,STDOUT_FILENO ,STDERR_FILENO重定向到 /dev/null。6.执行守护进程逻辑#include<sys/stat.h>#include<

2020-09-17 22:21:04 168

原创 Linux 之 信号的忽略,屏蔽和捕捉

Linux 之 信号的忽略,屏蔽和捕捉正文Linux 下信号的三种处理方式:1.执行默认动作2.忽略3.捕捉信号的忽略#include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);参数:signum: 信号handler:处理动作,传SIG_IGN表示忽略#include<stdio.h>#include&

2020-09-16 18:06:26 3866

原创 Linux 之 进程间互斥

Linux 之 进程间互斥正文使用互斥锁实现进程间同步1.创建互斥锁属性,并将之设置为PTHREAD_PROCESS_SHARED2.使用mmap函数创建合适大小的共享内存映射3.使用互斥锁属性初始化共享内存映射中的互斥锁#include<stdio.h>#include<unistd.h>#include<string.h>#include<stdlib.h>#include<pthread.h>#include<er

2020-09-15 22:10:10 506

原创 Linux 之 信号量

Linux 之 信号量正文sem_init函数sem_destroy函数sem_wait函数sem_trywait函数 sem_timedwait函数 sem_post函数以上6 个函数的返回值都是:成功返回0, 失败返回-1,同时设置errno。(注意,它们没有pthread前缀)sem_initint sem_init(sem_t *sem, int pshared, unsigned int value);参数:sem:信号量 pshared:取0用于线程间;取非0(一般为1

2020-09-13 22:20:02 444

原创 Linux 之 条件变量

Linux 之 条件变量正文pthread_cond_init函数pthread_cond_destroy函数pthread_cond_wait函数pthread_cond_timedwait函数pthread_cond_signal函数pthread_cond_broadcast函数以上6 个函数的返回值都是:成功返回0, 失败直接返回错误号。pthread_cond_initint pthread_cond_init(pthread_cond_t *restrict cond, co

2020-09-13 21:04:00 843

原创 Linux 之 互斥锁和读写锁

Linux 之 互斥锁和读写锁正文互斥锁Linux下的互斥锁是一个pthread_mutex_t类型的结构体。pthread_mutex_init函数pthread_mutex_destroy函数pthread_mutex_lock函数pthread_mutex_trylock函数pthread_mutex_unlock函数以上5个函数的返回值都是:成功返回0, 失败返回错误号。pthread_mutex_initint pthread_mutex_init(pthread_mutex

2020-09-12 23:32:37 284

原创 Linux 之 设置线程属性

Linux 之 设置线程属性正文可以在线程创建调用pthread_create函数时指定线程属性。线程属性是一个结构体:typedef struct{int etachstate; //线程的分离状态int schedpolicy; //线程调度策略struct sched_param schedparam; //线程的调度参数int inheritsched; //线程的继承性int scope; //线程的作用域size_t

2020-09-12 20:20:02 362

原创 Linux 之 线程创建,退出与回收

Linux 之 线程创建,退出与回收正文Linux下的线程Linux下的线程是轻量级的进程(LWP)。同样的,线程是cpu最小的执行单位,可以多个线程共享同一进程的地址空间。但是每个线程都拥有自己独立的PCB。线程是栈和寄存器的集合。系统以LWP号作为分配资源的依据,可以使用 ps -Lf 进程ID 来查看该进程下的线程。同一进程内线程间共享资源:文件描述符表,信号处理方式,当前工作目录,用户ID,组ID,内存地址空间(栈除外)。非共享资源:线程ID,信号屏蔽字,用户栈空间,errno变量,进

2020-09-12 01:10:50 1004

原创 Linux 之 mmap

Linux 之 mmap正文mmap函数可以将磁盘文件与进程存储空间的一个缓冲区相映射,多个进程可以映射同一文件来实现共享内存。1.函数原型#include <sys/mman.h>void *mmap(void *adrr, size_t length, int prot, int flags, int fd, off_t offset);int munmap(void *addr, size_t length);mmap函数:**返回值:成功:返回创建的映射区首地址;失败:

2020-09-10 23:47:55 203

原创 Linux 之 FIFO

Linux 之 FIFO正文FIFO 也被称为命名管道,相较于pipe来说,FIFO可以在非亲缘进程间通信。FIFO也是由内核维护的队列,虽然有文件路径,但是不属于文件系统中。函数原型:#include <sys/types.h>#include <sys/stat.h>int mkfifo(const char *filename, mode_t mode);使用 mkfifo 创建FIFO文件,filename为文件的路径,mode为文件权限,在这里要注意掩码对于

2020-08-26 16:39:40 445

原创 Linux 之 pipe管道

Linux 之 pipe管道前言Linux下有很多IPC机制,pipe管道就是其中的一种。正文管道的概念pipe被称为无名管道,用于亲缘进程间的通信。pipe管道实质为一个内核维护的环形队列,缓冲区大小为4K。工作方式为半双工通信。调用 pipe函数可以创建一个管道。函数原型:#include <unistd.h>int pipe(int fd[2]);管道有读写两端,fd[0]为读端,fd[1] 为写端。对于一个进程来说,要么对管道进行读操作,要么对其进行写操作,不可以自己写

2020-08-24 23:10:30 522

原创 内存管理(四)SGI STL 空间配置器

前言根据之前的学习,C++的内存申请的基本操作就是: 调用::operator new();释放内存的操作就是:调用 ::operator delete()。而二者是通过malloc() 和 free() 实现的。因此SGI空间配置器就是使用malloc() 和 free() 来代替C++的内存操作实现的内存管理。正文1.空间配置器的要求SGI 对于空间配置器的设计提出了一下几点:1.向 system heap 要求空间2.考虑多线程状态3.考虑内存不足时的应变措施4.考虑过多“小型区块”可

2020-08-02 22:38:38 342

原创 内存管理(三)内存池

前言我们每一次使用new来给类对象分配内存的时候都需要在所分配空间的头尾加上两个cookie来保存所分配内存的大小,这就增加了八个字节的开销。所以想要减小这个开销的办法就是一次性开辟一个大的内存,将这个大的内存划分成固定大小的块,块与块之间用指针连接(形成了一个链表),每次new的时候从这个内存里返回一块空间,delete的时候再将这块内存放回大的内存中去。这样的方式就形成了一个内存池。根据之前文章提到的内容,我们可以通过重载operator new 和 operator delete 的方式来实现内存池

2020-07-08 14:47:35 274

原创 内存管理(二)new[] 使用 delete 造成内存泄漏

正文在说明使用new[]申请内存,而使用delete释放的问题之前,先了解new[] 和 delete[] 的工作方式。一.new[]1.调用operator new[] ,由operator new[]调用n次operator new 来分配n个对象的空间。2.调用n次构造函数。二.delete[]1.调用n次析构函数。2.调用operator delete[] ,由operator delete[]调operator delete来释放空间。先探究一下是否真的是这样的:#include

2020-07-05 23:28:22 1709

原创 内存管理(一)new 和 delete 底层实现

前言最近在看侯捷老师的内存管理这门课,整理一下课程中的知识和自己的思路。正文1.new在c++的使用中,我们使用new手动申请堆区内存。下面看一下new到底干了什么。举个例子:Complex * pc = new Complex(1,2);这行代码是使用new创建一个Complex型的对象。在底层编译器实际上是完成下面的事情:Complex *pc;try{ void* tmp = operator new(sizeof(Complex)); // 调用operator::new 分

2020-07-05 00:03:40 251

原创 递归

递归先来解释以下递归,其实很简单:就是函数在运行的过程中调用自己。在一个计算过程中,如果其中每一步都要用到前一步或前几步的结果,称为递归的。用递归过程定义的函数,称为递归函数~那么在数学中,关于递归函数的定义如下:对于某一函数f(x),其定义域是集合A,那么若对于A集合中的某一个值X0,其函数值f(x0)由f(f(x0))决定,那么就称f(x)为递归函数。...

2020-04-28 21:24:32 232

原创 C语言从代码到可执行程序的过程

C语言从代码到可执行程序的过程一个C语言程序,从代码到可执行程序的过程需要四个步骤:预处理,编译 ,汇编,链接。1.预处理预处理负责对源代码进行文本处理。主要处理代码中以字符#开头的命令。有以下几个处理的地方:(一)解析所有的条件预处理指令。(二)解析定义的宏,将代码中使用的宏进行替换。(三)删除注释(四)解析 #include,将引入的头文件拷贝到当前命令位置(五)添加行号号和...

2020-04-16 22:16:51 3419

原创 Windows 之 跨进程边界共享内核对象

跨进程边界共享内核对象在很多情况下,我们需要跨进程边界共享内核对象。实现的方法有三种,继承对象句柄,给对象命名,复制对象句柄。1.继承对象句柄只有当进程具有父子关系时,才可以使用对象句柄的继承性。想要父进程生成一个子进程,并且赋予子进程对父进程内核对象的访问权,父进程必须完成以下几个操作:当父进程创建内核对象时,必须向系统指明,它希望对象的句柄是个可继承的句柄,也就是 SECURITY_A...

2020-04-12 18:20:34 273

原创 Windows 之 内核对象

1.什么是内核对象:内核对象的类型有很多,比如存取符号对象、事件对象、文件对象、文件映射对象、I/O完成端口对象、作业对象、信箱对象、互斥对象、管道对象、进程对象、信标对象、线程对象和等待计时器对象等。内核对象是内核分配的一个内存块,并且只能由该内核访问。该内存块是一种数据结构,它的成员负责维护该对象的各种信息。有的数据成员(安全描述符,使用计数器)在所有对象类型中是相同的,但大多数数据成员...

2020-04-12 11:53:33 473

原创 c++ 学习之 多线程(九)async,future,packaged_task,promise

1.std::futurestd::future是一个模板类,可以从异步任务中获取结果。将future对象与async,packaged_task对象进行绑定,调用get()函数来获取结果。2 .std::asyncstd::async 是c++11提供的一个创建异步任务的模板类,比thread类的功能更加全面。async的三种启动策略(一)用std::launch::async启动#...

2020-04-04 22:54:58 220

原创 c++ 学习之 多线程(八)条件变量condition_variable

c++ 学习之 多线程(七)条件变量condition_variablecondition_variable成员函数condition_variable 是 c++11 提供的一个可以实现线程同步的类。下面来总结一下条件变量condition_variable的用法。1. condition_variable::wait()成员函数wait()需要与unique_lock搭配使用。wait...

2020-04-02 21:41:45 435

原创 c++ 学习之 多线程(七)call_once

c++ 学习之 多线程(七)call_once前言有时候我们需要在第一次执行某个函数时进行一个特定的操作,后面再次执行该函数时,就不再进行这个特定操作了,std::call_once 很好的解决了这个问题。正文call_once 需要和 std::once_flag 这个标记结合使用。所以往往将std::once_flag 设置位全局变量。在这里插入代码片...

2020-03-31 21:04:39 488

原创 设计模式 之 单例模式

设计模式 之 单例模式在某些特定的情况下,例如 线程池,内存池的管理类,要求只能创建一个实例的时候所使用的设计模式就是单例模式。我们可以通过将构造函数私有化的方法来实现单例模式。本文着重于多线程下的单例模式。#include<stdio.h>#include<mutex>using namespace std;mutex m;class Singleton{...

2020-03-31 16:04:28 350

原创 c++ 学习之 多线程(六)lock_guard 和 unique_lock

c++ 学习之 多线程(六)lock_guard 和 unique_lock前言在使用mutex互斥量时,总会出现lock后没有unlock的情况,尤其是在判断分支中,某些被不常进入的分支忘记unlock,我们可以用RAII机制的模板类来解决忘记unlock的问题。正文1.std::lock_guardstd::lock_gurad 是 C++11 中定义的模板类,定义如下:templ...

2020-03-04 13:44:06 454

原创 c++ 学习之 多线程(五)互斥量 mutex

c++ 学习之 多线程(五)互斥量 mutex前言在多线程的应用中,常常会涉及到共享数据,当我们直接对共享数据进行操作时,比如多个进行同时进行写操作时,就会发生异常,接下来我们引入互斥量来解决这个问题。正文先来看一下这个代码:在这里插入代码片...

2020-03-01 20:26:47 217

原创 c++ 学习之 多线程(四)再谈 join 与 detach

c++ 学习之 多线程(三)再谈 join 与 detach前言在之前的学习中,我们初步了解了join与detach的作用,但是当实际应用的时候,有很多地方需要注意,不然总会发生一些意想不到的事情发生,下面我们来说一说join与detach的坑。正文1.实参传递问题问题场景:当我们用主线程中的局部变量当作实参去初始化thread对象后,调用detach将子线程与主线程分离开,并且主线程...

2020-02-24 22:44:41 405

原创 c++ 学习之 多线程(三) thread类的成员函数

c++ 学习之 多线程(三) thread类的成员函数前言thread类提供了几个成员函数,由于构造函数之前有讲过,所以本文着重分析一下其他函数的用法。正文1.~thread()析构函数,用来销毁thread对象,但是调用析构函数的前提必须是该thread对象是不可连接的,否则不可以。2.joinable()调用这个函数来判断该thread对象是否可连接,可以返回真,否则返回假。...

2020-02-19 20:57:19 2532

原创 c++ 学习之 可调用对象

c++ 学习之 可调用对象前言c++中,在使用一些基于范围的模板函数时,常常需要我们传入一个可调用对象,以指明我们需要对范围中的每个元素进行怎样的处理。在thread的初始化中也需要传入可调用对象来作为线程的入口函数。可调用对象也可以作为回调函数使用。可调用对象大概有这么几种:普通函数 ,类成员函数,类静态函数,仿函数,函数指针,lambda表达式,std::function。下面给大家进行简...

2020-02-19 10:23:43 424

原创 c++ 学习之 多线程(二) thread的参数传递

c++ 学习之 多线程(二) thread的参数传递前言上一篇文章中讲了thread的四种构造函数,接下来给大家讲一讲thread的参数传递。正文1.初始化构造函数利用初始化构造函数创建对象,第一个位置必须要传入一个可调用对象。c++ 中的可调用对象大概有这么几种:普通函数 ,类成员函数,类静态函数,仿函数,函数指针,lambda表达式,std::function。(1)普通函数用普...

2020-02-18 22:00:49 5014

原创 c++ 学习之 多线程(一) thread对象的创建

c++ 学习之 多线程(一)前言在之前的c++标准中,并没有提供对于多线程的支持,所以在应用中的开发需就要依赖操作系统提供的多线程接口,或者应用第三方的多线程库。这样一来,代码的移植性和开发的成本就存在了问题。c++ 11 标准提供了多线程的支持,增加的多线程代码的可移植性,大大降低了开发成本,以前依赖于平台或操作系统来开发多线程,现在有了统一致的实现。正文那么通过什么来创建一个线程呢?我...

2020-02-17 23:25:15 1132

原创 c++ 学习之 引用

c++ 学习之 引用前言当我们需要在函数内部对外部变量进行改变值操作时,必须要传递实参。我们最常见的作法就是传递一个指向该变量地址的指针,但是指针操作,往往让很多小伙伴很头疼,那么接下来给大家介绍一下可以实现同样功能而且更加方便的的操作 引用。正文什么是引用引用变量是一个变量的别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指...

2020-02-17 16:27:04 244

BlinkFlappyBird.zip

opencv+win32 实现的眨眼像素鸟,写着玩的,感兴趣的同学可以看看。

2020-04-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除