<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[lgfun的专栏]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/lgfun</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; lgfun]]></copyright><item><title><![CDATA[原子操作与无锁编程]]></title><link>https://blog.csdn.net/lgfun/article/details/113772424</link><guid>https://blog.csdn.net/lgfun/article/details/113772424</guid><author>lgfun</author><pubDate>Tue, 09 Feb 2021 16:32:52 +0800</pubDate><description><![CDATA[原子操作
CAS操作
原子操作能替代锁么

以上信息需要后续深入理解，目前只是简单了解

]]></description><category></category></item><item><title><![CDATA[【算法】分治、动态规划和贪心算法]]></title><link>https://blog.csdn.net/lgfun/article/details/113730305</link><guid>https://blog.csdn.net/lgfun/article/details/113730305</guid><author>lgfun</author><pubDate>Sat, 06 Feb 2021 20:45:29 +0800</pubDate><description><![CDATA[这三种算法非常相似，但是又有一些区别，理解如下：


分治：
把一个问题划分为若干子问题，求出子问题的最优解，再把子问题的最优解进行merge，最终得到原问题的最优解


动态规划；
原问题的最优解包含子问题的最优解（即，拥有最优子结构），同时，求子问题的最优解过程是存在重复的（即，子问题重叠），而分治法的子问题之间是独立的，不存在重复。这种case需要用动态规划来求解


贪心算法：
和动态规划类似，但是通过局部最优达到全局最优，而动态规划求解的是全局最优。贪心算法是自顶向下的求解过程。
贪心算法只需考虑]]></description><category></category></item><item><title><![CDATA[多线程 浅谈条件变量]]></title><link>https://blog.csdn.net/lgfun/article/details/113697926</link><guid>https://blog.csdn.net/lgfun/article/details/113697926</guid><author>lgfun</author><pubDate>Fri, 05 Feb 2021 16:25:05 +0800</pubDate><description><![CDATA[条件变量，cond wait过程中：存在：

调用wait前加锁
while判断并调用wait，
wait内部解锁，
wait收到信号后重新加锁\这几步操作，

即：在cond wait前，需要加锁，wait时，会把自己放到唤醒队列中，并释放锁；当生产者发来cond signal信号后，该cond wait操作会再次加锁，然后执行对临界资源的操作
条件变量有两点需要注意：

条件变量要和锁结合起来使用
条件变量要用while循环来判断条件是否成立，而不能用if语句来判断

关于以上两点的解释，可以参考：多线]]></description><category></category></item><item><title><![CDATA[记录一次jni内存泄漏]]></title><link>https://blog.csdn.net/lgfun/article/details/113183341</link><guid>https://blog.csdn.net/lgfun/article/details/113183341</guid><author>lgfun</author><pubDate>Tue, 26 Jan 2021 16:41:16 +0800</pubDate><description><![CDATA[关于jni如何才能不泄露内存的基本原则：

c/c++分配的资源，一律需要自己管理（可以用智能指针管理起来，或者用RAII思想管理），否则一定会存在内存泄漏
jni api分配的资源，若是c/c++类型，需要自己管理，因为这些变量分配在jni heap上，java不会帮你管理。若是java类型（jstring/jobject等各种j开头的类型），这些变量分配在java heap上，java的GC会帮你回收。

我本次的内存泄漏是上述第2点导致，即，我通过GetStringUTFChars从jstring得到]]></description><category></category></item><item><title><![CDATA[linux socket send函数和recv函数详解以及修改缓冲区大小]]></title><link>https://blog.csdn.net/lgfun/article/details/112909046</link><guid>https://blog.csdn.net/lgfun/article/details/112909046</guid><author>lgfun</author><pubDate>Wed, 20 Jan 2021 19:48:26 +0800</pubDate><description><![CDATA[一、send/recv详解
1.send 函数
int send( SOCKET s, const char FAR *buf, int len, int flags );
不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求，而服务器则通常用send函数来向客户程序发送应答。

该函数的第一个参数指定发送端套接字描述符；

第二个参数指明一个存放应用程序要发送数据的缓冲区；

第三个参数指明实际要发送的数据的字节数；

第四个参数一般置0。]]></description><category></category></item><item><title><![CDATA[十大经典排序算法]]></title><link>https://blog.csdn.net/lgfun/article/details/112569241</link><guid>https://blog.csdn.net/lgfun/article/details/112569241</guid><author>lgfun</author><pubDate>Wed, 13 Jan 2021 15:40:55 +0800</pubDate><description><![CDATA[来自

十大经典排序算法（动图演示）


]]></description><category></category></item><item><title><![CDATA[android studio生成和使用jar包]]></title><link>https://blog.csdn.net/lgfun/article/details/112464238</link><guid>https://blog.csdn.net/lgfun/article/details/112464238</guid><author>lgfun</author><pubDate>Mon, 11 Jan 2021 11:36:52 +0800</pubDate><description><![CDATA[生成jar
因为项目需求，需要把android代码生成jar包，供别人使用
在我调试阶段，我的android代码是app形态的，要想生成jar包，首先就要修改app下build.gradle的第一行（其实就和c++工程中cmake配置add_execute改成add_library类似，我们是为了生成库，不是二进制程序）：
apply plugin: ‘com.android.application’ 改成 apply plugin: ‘com.android.library’
同时，这行代码需要注释掉：
]]></description><category></category></item><item><title><![CDATA[android 9.0申请网络权限]]></title><link>https://blog.csdn.net/lgfun/article/details/112297863</link><guid>https://blog.csdn.net/lgfun/article/details/112297863</guid><author>lgfun</author><pubDate>Wed, 06 Jan 2021 21:12:57 +0800</pubDate><description><![CDATA[共三部操作：
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test4"&gt;
步骤1：
    &lt;uses-permission android:name="android.permission.INTERNET" /&gt;
    
    &lt;appli]]></description><category></category></item><item><title><![CDATA[android studio配置jni小结]]></title><link>https://blog.csdn.net/lgfun/article/details/112252776</link><guid>https://blog.csdn.net/lgfun/article/details/112252776</guid><author>lgfun</author><pubDate>Tue, 05 Jan 2021 21:08:17 +0800</pubDate><description><![CDATA[关于android工程添加jni相关配置，可参考以下博文，简单明了，其实主要就是添加一个CMakeLists.txt，修改下gradle内容（配置cmake路径、配置c++相关的flag）：

Android笔记之使用CMake进行JNI开发（Android Studio）

问题记录：

遇到A problem occurred configuring project ‘:app’.（注意，我的android studio在build出错之前，还提示warning： “NDK is missing a “]]></description><category></category></item><item><title><![CDATA[c++浅探类内存布局]]></title><link>https://blog.csdn.net/lgfun/article/details/112234013</link><guid>https://blog.csdn.net/lgfun/article/details/112234013</guid><author>lgfun</author><pubDate>Tue, 05 Jan 2021 14:50:08 +0800</pubDate><description><![CDATA[总结
多重继承和虚继承不用了解太多，现实中不怎么用到。
对单继承

若父类和子类都没有虚函数，则子类对象的内存布局没有虚表指针和虚表，只有成员变量的内存（字节需要对齐），且父类成员在内存低地址，子类额外的成员在内存高地址（因此，子类指针可以转换为父类指针，又可以再次转换为子类指针，因为子类对象的内存中低地址为父类的成员变量）
若父类有虚函数，则子类对象的内存布局起始地址部分为虚表指针，指向虚表，后面的结构同上。虚表里面，包含了父类和子类的虚函数，若子类覆盖了父类的虚函数，则子类的虚函数在子类的虚表里面。在构]]></description><category></category></item><item><title><![CDATA[c++优先级队列访问元素方法]]></title><link>https://blog.csdn.net/lgfun/article/details/112009137</link><guid>https://blog.csdn.net/lgfun/article/details/112009137</guid><author>lgfun</author><pubDate>Thu, 31 Dec 2020 15:04:45 +0800</pubDate><description><![CDATA[stl提供的优先级队列priority_queue，功能很少，主要是没法通过下标或者迭代器访问元素，只能不停地pop元素去逐一访问，非常难用。
如何访问优先级队列的元素？


方法1，继承c++ stl优先级队列（c++优先级队列内部使用的sequence成员的访问级别是protected，在你的子类中可以把该sequence的迭代器开放出来，达到访问元素目的）



方法２，可以利用multimap实现优先级队列，能做到：



自定义key比较器
相比普通map，multimap允许key重复
mult]]></description><category></category></item><item><title><![CDATA[android引入framework.jar，调用“废弃”api]]></title><link>https://blog.csdn.net/lgfun/article/details/111995538</link><guid>https://blog.csdn.net/lgfun/article/details/111995538</guid><author>lgfun</author><pubDate>Wed, 30 Dec 2020 17:54:23 +0800</pubDate><description><![CDATA[主要的一个问题是，在引入framework.jar之后，会出现
“Caused by: java.lang.ArrayIndexOutOfBoundsException: 65535”问题
解决办法：

AS中导入framework.jar包编译，运行全部通过（主要是注释掉了第一句fileTree命令，就解决了65535问题)


其他参考：

implementation、api、compileOnly区别详解


...]]></description><category></category></item><item><title><![CDATA[c++ std::stringstream清除字符串]]></title><link>https://blog.csdn.net/lgfun/article/details/111185348</link><guid>https://blog.csdn.net/lgfun/article/details/111185348</guid><author>lgfun</author><pubDate>Mon, 14 Dec 2020 20:48:15 +0800</pubDate><description><![CDATA[stringstream.str()会返回其内部字符串的拷贝。
有时候，想清空stringstream内部的字符串内容，真确的清理方式是：
stringstream.str(std::string());
stringstream.clear();

其中，stringstream.str(std::string())的作用是清空stringstream内部的字符串内容，
stringstream.clear()的作用是将该流中所有的状态位复位，将流的状态设置为有效。这一句也很关键，这是因为当流发生错误后，]]></description><category></category></item><item><title><![CDATA[《计算机网络》传输层 （1）]]></title><link>https://blog.csdn.net/lgfun/article/details/110845862</link><guid>https://blog.csdn.net/lgfun/article/details/110845862</guid><author>lgfun</author><pubDate>Mon, 07 Dec 2020 21:49:41 +0800</pubDate><description><![CDATA[总结：
todo
参考：

《计算机网络第七版-谢希仁》
40 张图带你搞懂 TCP 和 UDP


]]></description><category></category></item><item><title><![CDATA[c++虚函数表知识点]]></title><link>https://blog.csdn.net/lgfun/article/details/109719486</link><guid>https://blog.csdn.net/lgfun/article/details/109719486</guid><author>lgfun</author><pubDate>Mon, 16 Nov 2020 14:05:56 +0800</pubDate><description><![CDATA[参考：理解 C++ 虚函数表

类的普通函数（非虚函数），在内存中地址是唯一的，可以把他们想象成普通函数，只不过第一个参数是this指针，在通过类对象指针调用时，编译器会根据类型找到相应的非虚函数的地址，这个工作是编译期完成的
每个类都会维护一个虚表，编译时，编译器根据类的声明创建出虚表，对象被构造时，虚表的地址就会被写入到这个对象内存的起始位置。父类、子类的虚表是不同的，虚表里面的内容也是不一样的（虚表里面记录了要执行的函数的函数指针）。虚函数在执行是一个动态的过程，并不是在编译时就确定下来要执行哪一个函]]></description><category></category></item><item><title><![CDATA[android ndk程序crash解决手段]]></title><link>https://blog.csdn.net/lgfun/article/details/109242489</link><guid>https://blog.csdn.net/lgfun/article/details/109242489</guid><author>lgfun</author><pubDate>Fri, 23 Oct 2020 15:01:46 +0800</pubDate><description><![CDATA[背景
在linux x86系统中，如果程序发生了crash，可以通过core dump生成core文件，然后gdb进行分析，这方面的资料很多。
在android环境中，native程序crash，该怎么办呢？也可以生成core文件，然后用安卓编译工具链里面的gdb等工具进行分析，这块可以参考：Android 下基于core文件分析crash信息
更为简单的一种方式，可以直接查看tombstone文件。当native程序崩溃时，安卓会在/data/tombstone目录下生成对应的tombstone文件，该文]]></description><category></category></item><item><title><![CDATA[【转载】【好文、通俗易懂】Linux 进程、线程、文件描述符的底层原理]]></title><link>https://blog.csdn.net/lgfun/article/details/109230545</link><guid>https://blog.csdn.net/lgfun/article/details/109230545</guid><author>lgfun</author><pubDate>Thu, 22 Oct 2020 20:59:34 +0800</pubDate><description><![CDATA[看到一篇非常通俗易懂的文章，分享给对这块不熟悉的小白：
Linux 进程、线程、文件描述符的底层原理

]]></description><category></category></item><item><title><![CDATA[linux系统获取cpu占用的方法]]></title><link>https://blog.csdn.net/lgfun/article/details/109183935</link><guid>https://blog.csdn.net/lgfun/article/details/109183935</guid><author>lgfun</author><pubDate>Tue, 20 Oct 2020 17:53:59 +0800</pubDate><description><![CDATA[获取某进程cpu占用有很多方法，比如top命令，ps命令，以及读取系统文件(/proc/pid/stat)等等，有时候需要评估某个程序运行过程中的资源占用（例如cpu占用、mem占用），此时可以利用上面的读取系统文件方法，准确方便地得到cpu/memory占用信息
通过/proc/pid/stat文件获取指定进程的cpu占用信息
该文件有很多字段，其中跟cpu占用有关的为：utime、stime、cutime、cstime，他们的含义分别为：某进程在用户空间消耗的cpu时间片、在内核空间消耗的cpu时间片、]]></description><category></category></item><item><title><![CDATA[shell脚本实现覆盖写文件和追加写文件]]></title><link>https://blog.csdn.net/lgfun/article/details/108834822</link><guid>https://blog.csdn.net/lgfun/article/details/108834822</guid><author>lgfun</author><pubDate>Sun, 27 Sep 2020 19:32:20 +0800</pubDate><description><![CDATA[1、覆盖写文件 “&gt;”
date  &gt; not_append_file.txt


2、追加写文件"&gt;&gt;"
echo "hello" &gt; yes_append_file.txt
date &gt;&gt;  yes_append_file.txt


来自：shell脚本实现覆盖写文件和追加写文件

]]></description><category></category></item><item><title><![CDATA[视频文件与视频编解码简介]]></title><link>https://blog.csdn.net/lgfun/article/details/108797719</link><guid>https://blog.csdn.net/lgfun/article/details/108797719</guid><author>lgfun</author><pubDate>Fri, 25 Sep 2020 15:47:31 +0800</pubDate><description><![CDATA[工作中，经常会处理各种后缀名的视频，例如.avi/.mp4等等，怎么理解这些名字呢？
其实，对于一个视频，大的概念有两层：
第一层就是视频封装格式，即我们熟知的avi、MP4、MOV等都属于视频封装格式。视频封装格式，相当于一种储存视频信息的容器，内部可以存储具体的编码后的视频和编码后的音频文件，以及视频的字幕信息、视频的标题信息，等等
编码后的视频和编码后的音频文件，以及视频的字幕信息、视频的标题信息等内容，便是视频文件的第二层，也是比较核心的内容，决定了这个视频的大小以及视频的清晰度。一个完成的视频文件]]></description><category></category></item></channel></rss>