<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[jacktangj的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/jacktangj</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; jacktangj]]></copyright><item><title><![CDATA[Go语言包管理]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/79079820</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/79079820</guid><author>jacktangj</author><pubDate>Tue, 16 Jan 2018 22:09:12 +0800</pubDate><description><![CDATA[转载：https://www.cnblogs.com/sevenyuan/p/4548748.html

Golang使用包（package）这种语法元素来组织源码，所有语法可见性均定义在package这个级别，与Java 、python等语言相比，这算不上什么创新，但与C传统的include相比，则是显得“先进”了许多。

Golang中包的定义和使用看起来十分简单：

通过pack]]></description><category></category></item><item><title><![CDATA[libevent数据结构-TAILQ_QUEUE队列]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/77978886</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/77978886</guid><author>jacktangj</author><pubDate>Thu, 14 Sep 2017 12:14:04 +0800</pubDate><description><![CDATA[转载出处: http://blog.youkuaiyun.com/luotuo44/article/details/38374009

Libevent源码中有一个queue.h文件，位于compat/sys目录下。该文件里面定义了5个数据结构，其中TAILQ_QUEUE是使得最广泛的。本文就说一下这个数据结构。



队列结构体：

        TAILQ_QUEUE由下面两个结构体一起]]></description><category></category></item><item><title><![CDATA[Muduo库源码分析（9）：线程特定数据]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/76895688</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/76895688</guid><author>jacktangj</author><pubDate>Tue, 08 Aug 2017 12:48:39 +0800</pubDate><description><![CDATA[线程私有数据 
这些数据不会因为多进程共享数据而影响，因为是每个线程特有的数据。
线程私有数据实现对于POD类型可以使用__thread来修饰（详解见Thread类封装） 
http://blog.youkuaiyun.com/jacktangj/article/details/76222350
非POD类型可以使用线程特定数据封装 
线程特定数据讲解： 
http://www.cnblogs.com/java]]></description><category></category></item><item><title><![CDATA[Muduo库源码分析（8）：单例模式实现]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/76861932</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/76861932</guid><author>jacktangj</author><pubDate>Mon, 07 Aug 2017 21:51:01 +0800</pubDate><description><![CDATA[单例模式 
保证一个类只有一个实例，并提供一个访问它的全局访问点
参考资料 
C++设计模式——单例模式： http://www.jellythink.com/archives/82
Muduo库实现单例模式的思想： 
通过pthread_once在多个线程中只会初始化一次的特性实现的线程安全的单例模式
template<typename T>
class Singleton : noncopyab]]></description><category></category></item><item><title><![CDATA[Muduo库源码分析（7）：线程池]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/76861664</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/76861664</guid><author>jacktangj</author><pubDate>Mon, 07 Aug 2017 21:26:00 +0800</pubDate><description><![CDATA[线程池的本质 
生产者与消费者模型，往线程池添加任务相当于生产者，从线程池取出任务相当于消费者，线程池容量相当于有界的缓冲区，所以实现类似于有界缓冲区
class ThreadPool : noncopyable
{
 public:
  typedef std::function<void ()> Task;  explicit ThreadPool(const string& nameArg =]]></description><category></category></item><item><title><![CDATA[Muduo库源码分析（6）：有界缓冲区，无界缓冲区]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/76814472</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/76814472</guid><author>jacktangj</author><pubDate>Mon, 07 Aug 2017 10:19:54 +0800</pubDate><description><![CDATA[缓冲区的实现 
类似于生产者消费者模型，往缓冲区添加任务相当于生产者，从缓冲区提取任务相当于消费者，Muduo库使用条件变量加互斥锁实现的有界和无界缓冲区 
简易的条件变量加互斥锁实现的生产者消费者模型（无界）实现： 
http://blog.youkuaiyun.com/zjf280441589/article/details/43883113 
有界缓冲区
class BoundedBlockingQueu]]></description><category></category></item><item><title><![CDATA[Muduo库源码分析（5）：互斥锁，条件变量类]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/76449580</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/76449580</guid><author>jacktangj</author><pubDate>Mon, 31 Jul 2017 16:40:55 +0800</pubDate><description><![CDATA[互斥锁（muduo库简单的封装） 
将muduo库的线程id的操作去除的简单版本
// 出错处理
#define MCHECK(ret) ({ __typeof__ (ret) errnum = (ret); assert(errnum == 0); (void) errnum;})
class MutexLock : noncopyable
{
 public:
  MutexLock()
  {]]></description><category></category></item><item><title><![CDATA[C++中的RAII机制]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/76436715</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/76436715</guid><author>jacktangj</author><pubDate>Mon, 31 Jul 2017 14:30:42 +0800</pubDate><description><![CDATA[转载：http://www.cnblogs.com/gnuhpc/archive/2012/12/04/2802307.html

1.概念


Resource Acquisition Is Initialization 机制是Bjarne Stroustrup首先提出的。要解决的是这样一个问题：

在C++中，如果在这个程序段结束时需要完成一些资源释放工作，那么正常情况下自然是没]]></description><category></category></item><item><title><![CDATA[muduo库源码分析（4）：线程类]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/76222350</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/76222350</guid><author>jacktangj</author><pubDate>Thu, 27 Jul 2017 21:58:23 +0800</pubDate><description><![CDATA[与muduo线程类封装有关的源文件： 
    Thread.cc Thread.h CurrentThread.h
muduo线程类封装实现方式： 
基于对象的编程(利用boost::function/boost::bind实现)
简化版的线程类封装可参考： 
http://blog.youkuaiyun.com/jacktangj/article/details/76166554
muduo线程类整体结构：]]></description><category></category></item><item><title><![CDATA[muduo库源码分析（3）：异常类]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/76216243</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/76216243</guid><author>jacktangj</author><pubDate>Thu, 27 Jul 2017 18:52:59 +0800</pubDate><description><![CDATA[异常类Exception 
前言：
#include <execinfo.h>
int backtrace(void** buffer,int size);
buffer:是一个指针数组，数组中存放的是调用过的函数地址
buffer----->    ---------------
                |  调用函数地址  |    
                ----------]]></description><category></category></item><item><title><![CDATA[Muduo源码分析（2）：原子类]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/76187587</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/76187587</guid><author>jacktangj</author><pubDate>Thu, 27 Jul 2017 14:30:09 +0800</pubDate><description><![CDATA[原子性操作： 
 不会被线程调度机制打断的操作，效率高于锁操作
Muduo封装的gcc原子操作函数：
// 如果*ptr == oldval,就将newval写入*ptr,然后返回*ptr
// 否则直接返回*ptr
__sync_val_compare_and_swap(type *ptr, type oldval type newval, ...)// 返回修改前的值
__sync_fetch_]]></description><category></category></item><item><title><![CDATA[muduo源码分析（1）：时间类]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/76184901</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/76184901</guid><author>jacktangj</author><pubDate>Thu, 27 Jul 2017 13:28:45 +0800</pubDate><description><![CDATA[在muduo库中建立两个基类：
copyable和noncopyable来标识派生类是否是可拷贝或者不可拷贝的。muduo库中大部分类为不可拷贝的。
class noncopyable
{
 protected:
  noncopyable(){}
  // 封装了拷贝构造函数和复制操作符，使得派生类不可进行拷贝和赋值操作
 private:
  noncopyable(const noncopya]]></description><category></category></item><item><title><![CDATA[多线程Thread类不同封装实现]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/76166554</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/76166554</guid><author>jacktangj</author><pubDate>Wed, 26 Jul 2017 22:13:55 +0800</pubDate><description><![CDATA[多线程Thread类实现 
1.C语言实现方式：通过建立多个全局线程回调函数实现 
2.面向对象实现方式：通过多态特性实现，虚函数在派生类中不同的行为方式 
3.基于对象实现方式：通过boost::function和bind实现
- 对于Linux线程创建方式：
int pthread_create(pthread_t *restrict thread,  
        const pthrea]]></description><category></category></item><item><title><![CDATA[结构体struct 和 联合union 内存分配]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/73123978</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/73123978</guid><author>jacktangj</author><pubDate>Mon, 12 Jun 2017 16:49:04 +0800</pubDate><description><![CDATA[转载：http://www.cnblogs.com/fly1988happy/archive/2012/04/12/2444408.html


1.C语言中的结构体

1.1 定义

结构体是由一系列相同或不同类型的变量组成的集合。

struct 结构体名{               //struct为关键字，“结构体名”为用户定义的类型标识。

数据类型1 成员名1;]]></description><category></category></item><item><title><![CDATA[C++  opeartor new, new opeartor, placement new]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/72962338</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/72962338</guid><author>jacktangj</author><pubDate>Fri, 09 Jun 2017 16:13:07 +0800</pubDate><description><![CDATA[转载：http://blog.youkuaiyun.com/songthin/article/details/1703966

“new”是C++的一个关键字，同时也是操作符。关于new的话题非常多，因为它确实比较复杂，也非常神秘，下面我将把我了解到的与new有关的内容做一个总结。

new的过程

当我们使用关键字new在堆上动态创建一个对象时，它实际上做了三件事：获得一块内存空间、调用构造函数]]></description><category></category></item><item><title><![CDATA[linux中fork（）函数详解]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/71252856</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/71252856</guid><author>jacktangj</author><pubDate>Sat, 06 May 2017 13:02:54 +0800</pubDate><description><![CDATA[一、fork入门知识

     一个进程，包括代码、数据和分配给进程的资源。fork（）函数通过系统调用创建一个与原来进程几乎完全相同的进程，也就是两个进程可以做完全相同的事，但如果初始参数或者传入的变量不同，两个进程也可以做不同的事。
    一个进程调用fork（）函数后，系统先给新的进程分配资源，例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中，只有少数值与原来]]></description><category></category></item><item><title><![CDATA[ARP协议解析]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/52585075</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/52585075</guid><author>jacktangj</author><pubDate>Mon, 19 Sep 2016 13:40:56 +0800</pubDate><description><![CDATA[ARP协议

在数据链路层的以太网的协议中，每一个数据包都有一个MAC地址。我们知道每一块以太网卡都有一个MAC地址，这个地址是唯一的，那么IP包是如何知道这个MAC地址的？这就是ARP协议的工作。

ARP（地址解析）协议是一种解析协议，本来主机是完全不知道这个IP对应的是哪个主机的哪个接口，当主机要发送一个IP包的时候，会首先查一下自己的ARP高速缓存表（最近数据传递更新的IP-MAC]]></description><category></category></item><item><title><![CDATA[IP协议：IP数据报解析以及IP数据传输]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/52584735</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/52584735</guid><author>jacktangj</author><pubDate>Mon, 19 Sep 2016 12:37:58 +0800</pubDate><description><![CDATA[IP数据报解析

转载：点击打开链接

        TCP/IP协议定义了一个在局域网上传输的包，称为IP数据报（IP Datagram）。IP数据报由首部和数据两部分组成，首部部分包括版本，长度，IP地址等信息。数据部分一般用来存储上层协议其他的协议，如TCP，UDP和ICMP协议等。

（2）IP数据报首部格式

        

     版本：     指IP协议]]></description><category></category></item><item><title><![CDATA[linux下安装ffmpeg]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/51842741</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/51842741</guid><author>jacktangj</author><pubDate>Wed, 06 Jul 2016 22:09:42 +0800</pubDate><description><![CDATA[1.下载git，根据官方文档，下载编译ffmpeg需要git来实现，所以下载git，执行命令：
sudo apt-get install git git-core
2.更新git至最新版本库，执行命令：
git clone git://git.kernel.org/pub/scm/git/git.git
3.安装git成功，执行命令：
git --version
4.下载ffmpeg，]]></description><category></category></item><item><title><![CDATA[main函数的参数]]></title><link>https://blog.youkuaiyun.com/jacktangj/article/details/51810298</link><guid>https://blog.youkuaiyun.com/jacktangj/article/details/51810298</guid><author>jacktangj</author><pubDate>Sat, 02 Jul 2016 11:10:53 +0800</pubDate><description><![CDATA[转载：http://blog.youkuaiyun.com/yhawaii/article/details/7361302


main函数可以不带参数,也可以带参数，这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个，习惯上这两个参数写为argc和argv。因此，main函数的函数头可写为：

    main (argc,argv)

C语言还规定argc(第]]></description><category></category></item></channel></rss>