
C&C++学习
文章平均质量分 68
langzi989
每个现象后面都隐藏着一个本质,关键在于我们是否去挖掘它
展开
-
C++ Memory Order 理解
多线程编程过程中,并发、数据竞争和线程同步是一个绕不过的问题,为了支持多线程并发编程,C++提供了atomic、mutex等标准库用于原子操作以及线程之前的同步机制。在使用atomic进行原子操作的时候,由于原子操作可能在对象本身以外的内存进行操作,可能会导致线程A的操作1和操作2 在线程C、D看来执行顺序可能不同(即C可能看到的执行顺序是1->2,D可能看到的执行顺序是2->1),为了解决这个问题,在所有原子操作的接口中都提供了一个Memory Order参数,用于给Progermer提供灵活的控制选原创 2022-09-10 18:44:20 · 1136 阅读 · 1 评论 -
隐藏struct具体实现细节
我们知道对于struct,其所有的成员默认情况下是所有对外可见的,即为public属性。但是有时候为了提高程序的封装性,我们需要将struct的内容细节隐藏起来,怎么做呢?可以使用下面这种做法达到目的。// a.htypedef struct A At;class Test {public: Test(int a); int Get(); At* _a;};// a.cpp#include "a.h"typedef struct A { int a;} At;T原创 2020-06-01 00:26:19 · 885 阅读 · 0 评论 -
以示例方式记录pthread_once_t
#include <iostream>#include <thread>#include <vector>#include <pthread.h>/* 参考链接:https://www.cnblogs.com/qinwanlin/p/pthread_once.html* @desc: pthread_once_t* 用于控制函数只执行一次的变量,一般初始化为PTHREAD_ONCE_INIT,即0* 取值范围:*原创 2020-05-27 12:56:49 · 446 阅读 · 0 评论 -
以示例方式记录pthread_key_t
#include <thread>#include <iostream>#include <string>#include <vector>#include <chrono>// 参考链接:https://blog.youkuaiyun.com/Kaiwii/article/details/8461277/** @desc pthread_key_t* 线程特有变量,对进程来看只有一个变量,但是在线程中,该变量的数据是完全独立原创 2020-05-27 12:18:29 · 208 阅读 · 0 评论 -
条款1:视C++为一个语言联邦
条款1:视C++为一个语言联邦 最开始C++只是在C上添加了一些面向对象的特性。从C++最初的名称C with Classes也反映了这个血缘关系。 随着C++的发展和成熟,其体系越来越庞大,开始接受不同于面向对象的各种观念、特性以及编程战略。exception对函数结构化带来不同的做法,templates将我们带到新的设计思考方式,STL定义了一个前所未见的伸展性做法。今天的C+...原创 2019-10-09 22:43:13 · 673 阅读 · 0 评论 -
__attribute__((format(printf, 2, 3)))用法详解
_attribute_((format(printf, 2, 3)))用法详解在阅读redis源码的时候,遇到_attribute_((format(printf, 2, 3)))用法,在此记录下该用法的作用以及需要注意的点。1. 用法及作用 在C语言编程过程中,我们常常会实现一些可变参数的函数调用(类scanf、printf函数),变参函数在我们编程过程中带来了很大的方便,但是也有一些问...原创 2019-09-21 14:36:15 · 6836 阅读 · 1 评论 -
C语言柔性数组
C语言柔性数组 在阅读redis源码的时候遇到C语言的柔性数组的用法,之前有接触过但是没有深入了解,今天在网上查阅相关资料和写一些小的示例记录下C语言柔性数组的用法和特性。Redis在sds类型定义中提到了下列的用法,其中每个结构体的最后一个成员**char buf[]**即为柔性字数组的用法。下面这种使用方法,通过使用柔性数组,达到了sds类型的包头(header)与实际数据连续存储的目的...原创 2019-09-15 17:30:55 · 261 阅读 · 0 评论 -
函数dup与dup2
博客搬家,原地址:https://langzi989.github.io/2017/05/21/函数dup/函数原型#include <unistd.h>int dup(int fd);int dup2(int fd, int fd2);函数功能这两个函数的功能都是用来复制一个现有的文件描述符。返回的文件描述符与原有的文件描述符共用同一个文件表项,但是文件描述符标志将被...原创 2019-04-07 12:12:45 · 364 阅读 · 0 评论 -
why assigment operator can not be frined
博客搬家,原地址:https://langzi989.github.io/2017/03/21/why-assigment-operator-can-not-be-frined-function/this is a problem in my work and I have find th solution on stackoverflow,so recorder hereproblem ...原创 2019-04-07 12:11:59 · 361 阅读 · 0 评论 -
Wait函数详解
博客搬家,原地址:https://langzi989.github.io/2017/05/04/Wait函数详解/kill头文件sys/types.hsignal.h函数功能注意此函数的功能是向指定进程发送信号。而不是杀死某个进程.名字为kill的原因是早期的Unix系统对信号的默认处理方式大部分是终止进程。函数原型int kill(pid_t pid, int sig);返回值...原创 2019-04-07 12:11:02 · 3544 阅读 · 1 评论 -
Unix高级编程之signal
博客搬家,原地址:https://langzi989.github.io/2017/09/10/Unix高级编程之signal/signal函数相关的细节描述详见另外两篇篇博客,这里不详细赘述:https://langzi989.github.io/2017/09/08/C++函数指针学习/https://langzi989.github.io/2017/05/04/Wait函数详解/显示...原创 2019-04-07 12:09:30 · 208 阅读 · 0 评论 -
Unix错误处理
博客搬家,原地址:https://langzi989.github.io/2017/05/22/Unix错误处理/当Unix系统函数出错的时候,通常会返回一个负值,同时整型变量errno通常被设置为具有特定信息的值。例如当使用open打开文件的时候,若当前文件不存在,此时open的返回值为-1,errno被设置为2(ENOENT)。系统函数出错的返回值不一定为负数,是根据具体函数具体定义的,如...原创 2019-04-07 12:08:36 · 1398 阅读 · 0 评论 -
Unix网络编程相关错误码和信号处理
博客搬家,原地址:https://langzi989.github.io/2018/02/04/Unix网络编程相关错误码总结/特别注意当出现一下错误码时,处理之后一定要将errno复位为0在网络编程的过程中会出现一些错误码,下面总结:EAGAIN(11) : Resource temporarily unavailable错误原因:当将套接字设置为异步时,由于函数调用之后是立即返回...原创 2019-04-06 17:31:14 · 1057 阅读 · 0 评论 -
Unix网络编程基础之套接字结构
博客搬家,原地址:大多数的套接字函数都使用到了套接字地址,它们以套接字地址的指针作为参数。每个协议族都定义了自己的套接字地址结构,这些套接字地址结构均以sockaddr_开头,以协议族唯一的后缀结尾。IPv4套接字地址结构IPv4的套接字以sockaddr_in命名,其具体定义如下:#include <netinet/in.h>struct in_addr { in_ad...原创 2019-04-06 17:30:16 · 192 阅读 · 0 评论 -
Unix网络编程之读写相关函数
博客搬家,原地址:https://langzi989.github.io/2017/06/14/Unix网络编程之读写相关函数/socket编程中常用的输入输出函数(读写函数)总共有五对,它们都是默认阻塞的,这就意味着当发出一个不能立即完成的套接字调用的时候,其进程将被投入睡眠,等待相应的进程操作完成,函数才返回继续往下执行。常用的函数如下:read, writereadv, writev...原创 2019-04-06 17:29:17 · 198 阅读 · 0 评论 -
Unix网络编程之基础函数(一)
博客搬家,原地址:https://langzi989.github.io/2017/06/13/Unix网络编程之基础函数(一)/TCP客户端与服务器之间交互过程在程序实现上的体现如下图所示,注意思考这个过程中TCP状态的变化(参考TCP状态转换图):服务器首先调用socket函数创建socket,通过bind函数将socket与主机地址及端口绑定,然后调用listen函数对主机端口进行监听...原创 2019-04-06 17:28:23 · 213 阅读 · 0 评论 -
Unix网络编程之socket异步编程
博客搬家,原地址:https://langzi989.github.io/2017/06/15/Unix网络编程之socket异步编程/ioctl我们常用ioctlsocket的FIONBIO模式对socket进行设置是否启用异步。int ioctlsocket(int sockfd, long cmd, unsigned long* args);ioctlsocket函数的作用是获取与...原创 2019-04-06 17:24:07 · 302 阅读 · 0 评论 -
Unix系统调用hook函数以及使用dl库实现
博客搬家,原地址:https://langzi989.github.io/2017/10/16/Unix系统hook函数以及使用dl库实现/系统调用属于一种软中断机制(内中断陷阱),它有操作系统提供的功能入口(sys_call)以及CPU提供的硬件支持(int 3 trap)共同完成。hook系统调用:为当用户代码调用系统调用的时候,我们通过某种手段入侵该系统调用,使得系统调用中除了执行原有的...原创 2019-04-06 17:22:02 · 409 阅读 · 0 评论 -
Unix环境变量
博客搬家,原地址:https://langzi989.github.io/2017/05/22/Unix环境变量/概述在Unix中,每个进程都有自己的一组环境变量,这些环境变量,要么是一组全局字符串,要么是子进程从父进程继承而来的,如果子进程不对其修改则与父进程的环境变量一模一样。Unix内核并不查看这些字符串,它们的解释权完全取决于各个应用程序。例如shell是Unix中一个可执行程序,通...原创 2019-04-06 17:20:17 · 958 阅读 · 0 评论 -
Unix标准IO文件流及缓冲类型
博客搬家,原地址:https://langzi989.github.io/2017/05/24/Unix标准IO缓冲类型/Unix标准IO文件流在文件IO相关函数的一节中,我们所有的I/O函数都是围绕着文件描述符来操作的,当打开一个文件的时候,即返回一个文件描述符,然后该文件描述符用于后续的文件操作。而对于标准IO库,对于文件的操作都是围绕这** 文件流 file stream**进行的。当我...原创 2019-04-05 18:23:33 · 513 阅读 · 0 评论 -
Unix标准IO库相关函数总结之读写流(二)
博客搬家,原地址:https://langzi989.github.io/2017/06/03/Unix标准IO库函数之读写流(二)/读写流的三种方式一旦一个流被打开,则可以选择三种方式对其进行读写。每次一个字符的IO,一次读或者写一个字符,如果流是带缓冲的,则标准IO函数处理所有的缓冲。每次一行的IO。每次读写一行数据,可以使用fgets和fputs函数,但是要说明最大行的长度。直接...原创 2019-04-05 18:22:44 · 163 阅读 · 0 评论 -
Unix标准IO库相关函数总结之打开关闭流(一)
博客搬家,原地址:https://langzi989.github.io/2017/05/31/Unix标准IO库函数之打开关闭流(一)/Unix标准IO类型FILE在Unix相关的文件IO中几乎所有的函数都用到了文件描述符,文件描述符是打开一个文件时返回的一个可用的最小的文件描述标识。相应的在Unix标准IO相关的函数中,几乎每个函数都用到了FILE数据类型。本小结简单介绍一下FILE结构体...原创 2019-04-05 18:21:33 · 223 阅读 · 0 评论 -
Unix时间相关函数总结
博客搬家,原地址:https://langzi989.github.io/2017/06/11/Unix时间相关函数总结-md/在进行Unix编程的过程中,我们不可避免的会遇到需要时间相关的操作,如文件的创建修改时间,数据库中字段插入或更新的时间。Unix时间相关的类型time_tstruct timebstruct timevalstruct timespecstruct tm...原创 2019-04-05 18:20:41 · 412 阅读 · 0 评论 -
Unix文件IO相关函数
博客搬家,原地址:https://langzi989.github.io/2017/05/22/Unix文件IO相关函数/Unix中大多数文件的操作只需要用到五个函数open、read、write、lseek、和close。本章将详细讲解这些函数的用法以及参数详解。文件描述符对于内核而言,所有打开的文件都是通过文件描述符进行引用。文件描述符是一个非负整数。当打开或者创建一个文件的时候,内核向...原创 2019-04-05 18:19:52 · 711 阅读 · 0 评论 -
Linux用于I/O的数据结构及fcntl函数详解
博客搬家,原地址:Linux内核用于IO的数据结构内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响.进程表项 每个进程在记录表中都有一个记录项,记录项中包含一张打开的文件描述符表,可将其视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是:文件描述符标志(close_on_exec,close_on_exec是一个进程所有...原创 2019-04-05 18:18:49 · 257 阅读 · 0 评论 -
Unix信号之sigaction函数
博客搬家,原地址:https://langzi989.github.io/2018/01/28/Unix信号之sigaction函数/sigaction函数是除signal函数之外的另一个可以设置信号处理的函数。sigaction用法比signal函数复杂,但是可以对信号处理进行更加精准更灵活的控制。sigaction是POSIX的信号接口,而signal函数是标准C的信号接口,所以sigact...原创 2019-04-05 18:15:13 · 253 阅读 · 0 评论 -
Unix中select,poll,epoll详解
博客搬家,原地址:https://langzi989.github.io/2017/10/08/Unix中SelectPollEpoll详解/网络应用需要处理的问题无非两类,网络I/O和数据计算问题。在处理计算密集型任务的时候,期间会有一些网络IO操作(如写数据库的操作,非本机),此时若使用同步IO,则会造成大量的IO等待,造成CPU使用率较低。所以此时考虑其他IO模型如异步模型。Unix下...原创 2019-04-05 18:14:12 · 259 阅读 · 0 评论 -
fcntl实现对文件加锁功能
博客搬家,原地址:https://langzi989.github.io/2018/01/06/Unix中fcntl实现对文件加锁功能/之前有一篇文章详细介绍了fcntl的用法,这一节将说明使用fcntl实现对文件加锁的功能,fcntl函数原型fcntl函数如下,具体用法可参考上面的文章。#include <fcntl.h>int fcntl(int fd, int cm...原创 2019-04-05 18:11:51 · 1106 阅读 · 0 评论 -
Linux中dlfcn库相关学习
博客搬家,原地址:https://langzi989.github.io/2017/10/16/Unix中dl库学习/在linux中静态链接库和动态链接库是进程之间代码共享的两种方式。Linux在<dlfnc.h>库中提供了加载和处理动态连接库的系统调用,使用非常方便。具体用法如下:dlfcn库中函数说明dlfcn库中主要包括四个函数:#include <dlfcn.h&...原创 2019-04-04 12:59:02 · 2859 阅读 · 0 评论 -
System V IPC 机制和key_t本质类型
博客搬家,原地址:https://langzi989.github.io/2017/09/20/UnixIPC中key_t类型本质/System V三种IPC机制System V IPC包括三种不同的通信机制消息队列:消息队列类似于管道,但是又有很大的差别。第一,消息队列是有边界的,所以消息队列的通信机制是通过消息进行传递,而管道是通过字节流进行通信。第二,每条消息包括一个完整的整形字段...原创 2019-04-04 12:58:12 · 2829 阅读 · 0 评论 -
ucontext族函数详解
博客搬家,原地址:https://langzi989.github.io/2017/10/06/ucontext函数详解/the ucontext_t type is a structure type suitable for holding the context for the user thread of execution. A thread’s context include sta...原创 2019-04-04 12:52:26 · 5942 阅读 · 1 评论 -
rapidjson查询操作基本用法
博客搬家,原地址:https://langzi989.github.io/2017/05/27/rapidjson查询操作基本用法/本系列文章以例子的方式进行呈现。#include "rapidjson/document.h"#include <iostream>int main(){ const char* test = "{\"num\":123, \"hell...原创 2019-04-04 12:48:43 · 2818 阅读 · 0 评论 -
rapidjson指针
博客搬家,原地址:https://langzi989.github.io/2017/05/27/rapidjson指针/本系列文章以例子的方式进行呈现。#include "rapidjson/document.h"#include "rapidjson/pointer.h"#include <iostream>using namespace rapidjson;/...原创 2019-04-04 12:47:47 · 1805 阅读 · 0 评论 -
rapidjson创建型
博客搬家,原地址:https://langzi989.github.io/2017/06/21/rapidjson创建型/#include <iostream>#include "rapidjson/document.h"#include "rapidjson/stringbuffer.h"#include "rapidjson/writer.h"#include <s...原创 2019-04-03 12:55:25 · 240 阅读 · 0 评论 -
rapidjson Stream
博客搬家,原地址:https://langzi989.github.io/2017/05/27/rapidJsonStream/本系列文章以例子的方式进行呈现。#include <iostream>#include "rapidjson/rapidjson.h"#include "rapidjson/document.h"#include "rapidjson/strin...原创 2019-04-03 12:54:43 · 560 阅读 · 0 评论 -
rapidjson Schema
博客搬家,原地址:https://langzi989.github.io/2017/05/27/rapidjsonSchema/本系列文章以例子的方式进行呈现。/** JsonSchema本质上是一个json,其作用是用于校验Json,使用schema对json进行校验,* 可以让代码安全的去当问DOM,而不需要去检查类型或者键值的存在等等。这也能确保输* 出的json符合特定的sc...原创 2019-04-03 12:53:42 · 790 阅读 · 0 评论 -
pthread使用barrier栅栏方式同步
博客搬家,原地址:https://langzi989.github.io/2018/07/05/pthread使用barrier栅栏方式同步/Linux中提供了多种同步机制,其中使用barrier(栅栏)是多线程之间进行同步的方法之一。基本原理:假设多个线程约定一个栅栏,只有当所有的线程都达到这个栅栏时,栅栏才会放行,否则到达此处的线程将被阻塞。使用场景:程序启动的时候,需要建立一个独...原创 2019-04-03 12:50:35 · 1746 阅读 · 0 评论 -
mktime函数性能分析
博客搬家,原地址:https://langzi989.github.io/2019/01/02/mktime性能分析/mktime是一个将break-down时间(struct tm)转化为日历时间(time_t)的转换函数。它的转换与struct tm中的 tm_wday、tm_yday无关,当进行转换时,mktime会通过struct tm的其他成员重新矫正该值。若struct tm中的成...原创 2019-04-03 12:47:21 · 2824 阅读 · 0 评论 -
makefile自动变量与隐晦规则推导
博客搬家,原地址:https://langzi989.github.io/2017/09/20/makefile自动变量与隐晦规则推导/makefile的使用可以大大简化程序编译的过程,不过对于新手来说makefile的执行规则理解起来还是很让人迷糊的。其中最重要的原因是makefile中使用了大量的隐晦规则和自动变量来简化makefile的编写.本节将记录一下makefile自动变量和隐晦规则...原创 2019-04-02 13:00:41 · 2964 阅读 · 0 评论 -
makefile常用相关函数
博客搬家,原地址:https://langzi989.github.io/2017/05/25/makefile常用相关函数/makefile中函数的用法与变量类似,变量的用法是在变量前面加上,函数的用法一样,也是使用,函数的用法一样,也是使用,函数的用法一样,也是使用开头,$之后加一个括号,括号中的第一个参数是函数名,后面紧跟此函数需要的参数,用逗号分隔。下面介绍几个常用的函数。wildca...原创 2019-04-02 12:59:48 · 158 阅读 · 0 评论