- 博客(21)
- 收藏
- 关注
原创 skyntet如何启动一个lua服务
初始化lua_State,先是将skynet_context保存起来,以方便lua层调用c的时候使用,然后就是一些配置设置,如设置一些lua服务脚本的存放路径,c服务so库的存放路劲(加载和调用的时候,回到这些路劲里寻找),然后该lua_State会加载一个用于执行指定脚本的loader.lua脚本,并将参数传递给这个脚本(参数就是snlua服务绑定的lua脚本名称和传给这个脚本拼起来的字符串,比如要启动一个名位scene的服务,那么对应的脚本名称就是scene.lua)
2023-09-25 16:16:15
186
原创 skynet消息调度机制
是实现的一种同步机制,也称“共享-互斥锁”,用于解决。读操作可并发重入,写操作是互斥的。这意味着多个线程可以同时读数据,但写数据时需要获得一个独占的锁。弱优先级强优先级读写锁通常用实现。
2023-09-20 10:34:23
158
1
原创 一个例子介绍条件变量
在此例中,生产者线程和消费者线程通过条件变量进行同步和通信。生产者线程在缓冲区满时等待条件变量,消费者线程在缓冲区空时等待条件变量。当有空间或者有元素可供消费时,对应的线程会被唤醒继续执行。通过互斥锁保护共享资源的访问,条件变量用于线程等待和唤醒操作。条件变量在多线程编程中的一个常见应用是线程间的同步和通信。假设有两个线程:生产者线程和消费者线程,它们共享一个缓冲区。
2023-09-19 11:17:42
113
原创 skynet 启动c服务的过程
config->logservice指log服务的so库名称,用于后面加载服务时使用,config->logger指log的输出路径。本文旨在记录我对skynet重新学习和理解的过程,也便于以后回顾(本文纯手打,输出的过程也是记忆的过程)。启动skynet节点时,会启动logger服务。
2023-09-14 15:54:15
165
1
原创 skynet-设计综述
作为核心功能,skynet仅解决一个问题:把一个符合规范的c模块,从动态库(so文件)中启动起来,绑定一个永不重复的数字id作为其handle。模块被称为服务,服务间可以自由的发送消息,每个模块可以向skynet框架注册一个callback函数,用来接收发给它的消息。每个服务都是被一个个消息包驱动的,当没有包到来的时候,它们就会处于挂起状态。对CPU的资源零消耗。如果需要自主逻辑,则利用skynet系统提供的timeout消息,定期触发。
2023-09-14 14:20:33
174
1
原创 什么是.so文件?怎么生成、有什么特性
SO文件全称为共享对象文件(Shared Object file),是一种二进制文件格式,用于存储程序的可执行代码和数据。与静态链接库不同的是,SO文件在程序运行时以动态链接的方式与其他程序或库进行连接。
2023-09-12 14:47:52
12093
原创 智能指针(unique_ptr、shared_ptr、weak_ptr)
主要参考链接:C++ 智能指针最佳实践&源码分析参考链接:C++11 make_shared - 简书智能指针在 C++11 标准中被引入真正的标准库(C++98 中引入的 auto_ptr 存在较多问题)为什么需要智能指针?解决动态内存分配时的内存泄露问题。auto_ptr(C++98的方案,C++11已经抛弃)auto_ptr<string> p1 (new string ("abc")); auto_ptr<string> p2.
2022-03-07 17:49:50
1871
原创 Effective C++读书笔记(条款07:为多态基类声明virtual析构函数)
C++指出,当派生对象经由基类指针被删除,而该基类带有一个非虚析构函数,其结果未有定义。实际执行时,通常发生的是派生对象成分没被销毁。基类通常会被销毁,造成一个“局部销毁”对象。解决方法很简单,给基类一个虚析构函数,此后删除的派生类对象就会如你想要的那般。任何函数只要带有虚函数,都几乎确定应该带有一个虚析构函数如果类内不含虚函数,通常表示它并不意图被用做一个基类,当类不被企图当作基类,令其析构函数为虚函数通常是个馊主意。欲实现出虚函数,对象必须携带某些信息,主要用来在运行期...
2022-02-27 08:15:00
189
原创 Effective C++读书笔记(条款05:了解C++默默编写并调用哪些函数 && 条款06:若不想使用编译器自动生成的函数,就该明确拒绝)
什么时候空类不再是一个空类呢?当C++处理过它之后。如果自己没有声明,编译器就会为它声明一个拷贝构造函数、拷贝赋值操作符和一个析构函数。此外,如果你没有声明任何构造函数,编译器也会为你声明一个default构造函数。所有这些函数都是public且inline的。编译器产出的析构函数是一个非虚函数,除非这个类的基类本身声明有virtual析构函数如果你打算在一个“内含引用成员”的class内支持赋值操作,你必须自己定义拷贝赋值操作符。面对“内含const成员”的classes,编译器的反应
2022-02-26 21:35:49
304
原创 Effective C++读书笔记(条款04:确定对象被使用前已被初始化)
永远在使用对象之前将它初始化。对于无任何成员的内置类型,你必须手功完成此事。int x=0; //对int进行手工初始化const char* text="A Cstyle string"; //对指针进行手工初始化double d;std::cin >> d; //以读取input stream的方式完成初始化...
2022-02-26 14:12:24
395
原创 十大排序算法(C++)(时间复杂度O(nlogn)篇:希尔排序、堆排序、快速排序、归并排序)
希尔排序希尔排序本质上是对插入排序的一种优化,它包括了插入排序的简单,同时解决了插入排序每次只交换相邻两个元素的缺点。插入排序过程如下:1.将数组按照一定的间隔分为多个子数组(每跳跃一定间隔取一个值组成一组),每组分别进行插入排序。2.缩小间隔进行下一轮排序。最后一轮排序时,间隔为 1,也就等同于于直接使用插入排序。由于前面的排序,现在数组已经基本有序了,此时的插入排序只需进行少量的交换即可完成。举个例子:对数组【2,16,8,1,8,4,7,13,20,3】。第一...
2022-02-21 11:20:20
4196
原创 从零开始的 JSON 库教程(三):解析字符串 学习整理笔记
原网址:从零开始的 JSON 库教程 - 知乎1. JSON 字符串语法JSON 的字符串语法和 C 语言很相似,都是以双引号把字符括起来,如 "Hello"。但字符串采用了双引号作分隔,那么怎样可以在字符串中插入一个双引号? 把 a"b 写成 "a"b" 肯定不行,都不知道那里是字符串的结束了。因此,我们需要引入转义字符(escape character),C 语言和 JSON 都使用 \(反斜线)作为转义字符,那么 " 在字符串中就表示为\",a"b 的 JSON 字符串则写成 "a
2022-02-20 17:22:49
378
原创 Effective C++读书笔记(条款03:尽可能使用const)
如果关键字const出现在*号的左边,被指物是常量。 如果关键字const出现在*号右边,表示指针自身是常量。 如果关键字const出现在*号两边,被指物和指针都是常量。char greeting[]="Hello";const char* p=greeting; //non-const pointer, const data(常量指针)char* const p=greeting; //const pointer, non-const data(指针常量)con
2022-02-19 21:25:10
616
原创 Effective C++读书笔记(条款02:尽量以const,enum,inline替换#define)
这个条款可以理解成“宁可以编译器替换预处理器”。使用常量可能比使用#define导致较小量的码,因为预处理器“盲目地将宏名称替换”可能导致目标码出现多份。
2022-02-19 20:33:47
527
原创 从零开始的 JSON 库教程(二):解析数字 学习整理笔记
原网址:从零开始的 JSON 库教程 - 知乎JSON 数字语法number 是以十进制表示,它主要由 4 部分顺序组成:负号、整数、小数、指数。只有整数是必需部分。注意和直觉可能不同的是,正号是不合法的。整数部分如果是 0 开始,只能是单个 0;而由 1-9 开始的话,可以加任意数量的数字(0-9)。也就是说,0123 不是一个合法的 JSON 数字。小数部分比较直观,就是小数点后是一或多个数字(0-9)。JSON 可使用科学记数法,指数部分由大写 E 或小写 e 开始,然后可有正
2022-02-18 14:51:18
268
原创 从零开始的 JSON 库教程(一):启程 学习整理笔记
原网址:从零开始的 JSON 库教程 - 知乎JSON 是什么?JSON(JavaScript Object Notation)是一个用于数据交换的文本格式。JSON 是树状结构,只包含 6 种数据类型:null: 表示为 null boolean: 表示为 true 或 false number: 一般的浮点数表示方式,在下一单元详细说明 string: 表示为 "..." array: 表示为 [ ... ] object: 表示为 { ... }我们.
2022-02-17 18:08:58
532
原创 十大排序算法(C++)(时间复杂度O(n^2)篇:冒泡排序、选择排序、插入排序)
冒泡排序冒泡排序的核心思想是:从头开始,依次比较数组中相邻的2个元素,将最大值/最小值交换到最后一位。void bubbleSort(vector<int>& nums) { for(int i=0;i<nums.size()-1;i++) { for(int j=0;j<nums.size()-1-i;j++) if(nums[j]>nums[j+1]) { int te..
2022-02-17 11:56:26
1131
原创 Effective C++读书笔记(条款01:视C++为一个语言联邦)
一开始,C++只是C加上一些面向对象的特性,C++最开始的名称C with Classes也反映了这个关系。随着语言的成熟,C++开始接受不同于C with Classes的各种观念、特性和编程战略。Exceptions(异常)对函数的结构化带来不同的做法,templates(模板)将我们带到了新的设计思考方式,STL则定义了一个前所未有的伸展性做法。现在的C++已经是一个多重范型的编程语言,同时支持过程形式,面向对象形式,函数形式,泛型形式,元编程形式。要理解C++,最简单的方法是
2022-02-16 12:31:04
240
原创 Effective C++读书笔记(导读)
声明式是告诉编译器某个东西的名称和类型,但略去细节。extern int x; //对象声明式std::size_t numDigits(int num); //函数声明式class Widge; //类声明式template<typename T> //模板声明式class GraphNode;std这个命名空间是几乎所有C++标准程序库元素
2022-02-16 12:03:52
306
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人