线程学习(二)
学习线程笔记记录。
原子操作原子类型123std::atomic_flag // 一个简单的布尔标志,并且在这种类型上的操作都需要是无锁的,不提供is_lock_free()成员函数std::atomic_flag = ATOMIC_FLAG_INIT // 清除标志std::atomic<> 类型模板
原子操作123std::atomic<> 类模板不仅仅一套特化的类型,其作为一个原发模板也可以使用用户定义类型创建对应的原子变量。因为,它是一个通用类模板,很多成员函数的操作在这种情况下有所限制:load(),store()(赋值和转换为用户类型), exchange(), compare_exchange_weak()和compare_exchange_strong()。
操作
内存顺序设置
Store(写)
memory_order_relaxedmemory_order_releasememory_order_seq_cst
Load(读)
memory_order_relaxedmemory_order ...
Cpp的规范开发建议
Effective C++ 规范以const、enum、inline替换#define
123456// #define NUM 10const unsigned int NUM = 10;enum { FIRST = 1; SECOND = 2;};
手工初始化对象
123unsigned int i = 0;string str = "";int *p = nullptr;
使用delete和virtual
123456789class Name {public: Name() = default; Name(std::string name_); virtual ~Name() = default;private: Name(const Name&) = delete; Name& operator=(const Name&) = delete;};
绝不在构造和析构函数中直接或者间接的调用virtual函数
123456789101112131 ...
C++的22种设计模式
C++的22种的设计模式,分析其使用的设计思想
参考源码地址
创建型SimpleFactory(简单工厂)设计思想简单工厂提供一个返回一个静态的实例的方法,封装了new的重复性,是一维的,仅仅抽象出方法接口。
Code
simple_factory.hpp123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263#ifndef PRODUCT_H#define PRODUCT_H#include <iostream>namespace simple_factory {class Door {public: Door() = default; virtual ~Door() = default; virtual float GetHeight() = 0; virtual float GetWidth() = 0;};class MyDoor ...
Git使用教程
学习Git的使用。
项目项目开发流程
产生: 1.明确需求和业务场景(用例图和如何使用) 2.设计代码框架(代码结构和数据流向) 3.分析设计细节业务的实现 4.设计类,设计流程图,序列图,状态图 5.评估设计和后续设计修改维护: 1.建立开发分支,开发完成 2.提交测试 3.生成changelog 4.测试通过,release提交changelog,打tag,合并到dev或者master上,删除临时分支
项目开发结构工程tree12345678910111213.vscode |--- settings.json // vscode 配置 |--- templates |--- cpp.lict // license文件 |--- h.lict // licen ...
Wtfui仪表图配置
Wtfui表格配置。
可执行文件 采用官方的github项目编译出win10平台和Linux平台的可执行文件。访问我的Wtfui的github仓库可以直接下载使用,配置参考文档。
配置文件config.yml12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091wtf: colors: background: black border: focusable: darkslateblue focused: orange normal: gray grid: columns: [40, 35, 35, 35] rows: [10, 10, 10, 10] refreshInterval: 15 ...
Docker容器
Docker容器在开发中的使用。
Docker概念Docker是一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的app),更重要的是容器性能开销极低。
Docker原理Docker是什么 Docker 利用 Linux 核心中的资源分脱机制,例如 cgroups,以及 Linux 核心名字空间(name space),来创建独立的软件容器(containers),属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。Docker 在容器的基础上进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护,使得其比虚拟机技术更为轻便、快捷。Docker 可以在单一 Linux 实体下运作,避免因为创建一个虚拟机而造成的额外负担。
Docker主要包含三 ...
RPC(Remote Produce Call)
RPC(Remote Procedure Call):允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,且不需要显式编码这个远程调用的细节。
IDL(Interface description language) 用来描述软件组件界面的一种计算机语言。IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信交流;比如,一个组件用C++写成,另一个组件用Java写成。IDL通常用于远程调用软件。在这种情况下,一般是由远程客户终端调用不同操作系统上的对象组件,并且这些对象组件可能是由不同计算机语言编写的。IDL建立起了两个不同操作系统间通信的桥梁,它实现端对端之间可靠通讯的一套编码方案。
传输数据的序列化和反序列化序列化和反序列化描述 序列化与序列化主要解决的是数据的一致性问题。对于数据的本地持久化,只需要将数据转换为字符串进行保存即可是实现,但对于远程的数据传输,由于操作系统,硬件等差异,会出现内存大小端,内存对齐等问题,导致接收端无法正确解析数据。 ...
编程语言学习推荐(个人)
C1、语法
1、C和指针2、C专家编程3、C陷阱与缺陷4、数据结构和算法分析(C语言)
编辑器vscode、Source Insight、vim
U-boot
1、U-Boot开发指南
Linux移植
1、嵌入式Linux基础教程2、深度实践嵌入式Linux系统移植3、嵌入式Linux应用开发完全手册
Linux内核
1、Linux内核设计和实现
Linux驱动C++1、语法
1、C++ Primer(或 C++程序设计语言)2、Effective C++ 和 More Effective C++3、Think in C++ 和 C++模板4、C++沉思录5、Exceptional C++ 和 More Exceptional C++6、Advanced C++ 和 Modern C++7、泛型编程与STL8、深入探索C++对象模型
2、面向对象设计
1、设计模式2、面向对象的分析和设计
3、开源库
1、boost
4、提高
编辑器vscode、Source Insight、vim、Visual Studio
Java1、语法
1、Head First Ja ...
非阻塞的Connect的Socket
非阻塞的Sokcet的学习
Connect函数声明: int connect (int sockfd,struct sockaddr * serv_addr,int addrlen)
功能: 使用套接字sockfd建立到指定网络地址serv_addr的socket连接,参数addrlen为serv_addr指向的内存空间大小,即sizeof(struct sockaddr_in)。
返回值: 1)成功返回0,表示连接建立成功(如服务器和客户端是同一台机器上的两个进程时,会发生这种情况)2)失败返回SOCKET_ERROR,相应的设置errno,通过errno获取错误信息。常见的错误有对方主机不可达或者超时错误,也可能是对方主机没有进程监听对应的端口。
非阻塞connect(non-block mode connect)套接字执行I/O操作有阻塞和非阻塞两种模式。在阻塞模式下,在I/O操作完成前,执行操作的函数一直等候而不会立即返回,该函数所在的线程会阻塞在这里。相反,在非阻塞模式下,套接字函数会立即返回,而不管I/O是否完成,该函数所在 ...