<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[sai_j的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/sai_j</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sai_j]]></copyright><item><title><![CDATA[[C++11] 线程安全的BoundedBlockingQueue]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/83003840</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/83003840</guid><author>sai_j</author><pubDate>Mon, 05 Oct 2020 02:14:09 +0800</pubDate><description><![CDATA[template &amp;lt;typename T&amp;gt;
class BoundedBlockingQueue {
public:
    explicit BoundedBlockingQueue(int maxSize) : ringbuffer(maxSize) {

    }

    void put(const T&amp;amp; x) {
        std::unique_lock&amp;...]]></description><category></category></item><item><title><![CDATA[bprc-bthread梳理]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/108894330</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/108894330</guid><author>sai_j</author><pubDate>Thu, 01 Oct 2020 13:09:14 +0800</pubDate><description><![CDATA[BRPC是baidu内部自研的一套RPC框架，除了易用性、高性能之外，核心的一个亮点就是当中完整实现了一套M-&gt;N的Green Threading（类似Golang的Goroutine）。
1）BRPC在公司内部大量使用，每天的工作基本上都绕着brpc转也不为过；
2）因为自己最早是写C出身的，自然对Golang喜欢的不行，Goroutine也用得不要太开心，但是一直没有对Goroutine的原理进行学习。
借此机会，希望通过对bthread的梳理，能管中窥豹M-&gt;N Green Threadi]]></description><category></category></item><item><title><![CDATA[[Kafka权威指南] Chapter 4. Kafka消费者：消费数据]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/89678842</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/89678842</guid><author>sai_j</author><pubDate>Mon, 29 Apr 2019 19:55:50 +0800</pubDate><description><![CDATA[Consumer Group

What is Consumer Group ?

Case：前端采集的数据通过Kafka Topic回传至后端分析程序，但是单个分析线程（Consumer）很有可能忙不过来。

既然单个消费者忙不过来，那就多来几个消费者。此时，这些消费者就构成了一个小团队。

Topic中的消息在被分割、摊派后，每个成员（消费者）就自顾自地忙自己那部分。

在Kafka中，这个团...]]></description><category></category></item><item><title><![CDATA[[Kafka权威指南] Chapter 1. 初识Kafka]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/89641438</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/89641438</guid><author>sai_j</author><pubDate>Sun, 28 Apr 2019 18:42:55 +0800</pubDate><description><![CDATA[What is Kafka?



基于“发布/订阅”模型的消息队列



Why Kafka?

多生产者
	方便数据聚合
	
	多消费者
	多个消费者同时消费同一个消息流，消息可以被多次重复消费。
		多个消费者可以组成一个Group，保证特定消息只消费一次。
	
	消息持久化
	消费者不需要战战兢兢地消费消息，就算忙不过来，Kafka也能缓一下
	
	可扩展
	高性能


Basic ...]]></description><category></category></item><item><title><![CDATA[[LevelDB] 一步步剖析AtomicPointer]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/88094368</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/88094368</guid><author>sai_j</author><pubDate>Mon, 04 Mar 2019 00:32:10 +0800</pubDate><description><![CDATA[AtomicPointer是LevelDB中的一个基础数据结构，其核心代码只有寥寥10来行。

但是，为了理解这10来行代码，却需要十分扎实的CPU架构、操作系统、编译器、C++11知识。

为了搞明白其背后的原理，同时加深理解，我准备从以下几点着手，一步步抽丝剥茧：

什么是乱序执行？
	什么是Memory Barrier ？
	Platform-Specific的AtomicPointer实...]]></description><category></category></item><item><title><![CDATA[[C++11] 万能引用总结]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/86483927</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/86483927</guid><author>sai_j</author><pubDate>Mon, 14 Jan 2019 21:15:50 +0800</pubDate><description><![CDATA[针对左值，万能引用等效左值引用；针对右值，万能引用等效右值引用；
 

针对左/右值，万能引用都正确进行了推导，那为啥还要有std::forward?
	因为右值引用是左值！！万恶之源
	
 

有点绕，为啥右值引用是左值？
	右值，就是“无名”的value，只有值，没有变量名；
		右值引用，本身就是一个变量，当然是左值；
		右值引用在绑定了右值后，为右值增加了一个“句柄”，这样看也当然是左值...]]></description><category></category></item><item><title><![CDATA[[C++11] ThreadPool]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/83099306</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/83099306</guid><author>sai_j</author><pubDate>Tue, 16 Oct 2018 23:51:23 +0800</pubDate><description><![CDATA[背景

近期，在造一个异步HTTP调用的轮子；https://github.com/Sai-Jiang

简单来说，通过一个Restful接口，代理会接收异步HTTP调用的请求；

这些接收到的异步HTTP调用请求，将会由代理代为去执行；

适用的场景，主要是低时延接口调用高时延接口；

HTTP的调用，目前准备用线程池来做；

线程池实现中的任务队列，我就直接复用了之前博客中的BoundedBl...]]></description><category></category></item><item><title><![CDATA[[C++] 适用程序退出的Signal Handler]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/83090443</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/83090443</guid><author>sai_j</author><pubDate>Tue, 16 Oct 2018 16:17:58 +0800</pubDate><description><![CDATA[To the point



#include &amp;lt;csignal&amp;gt;
#include &amp;lt;glog/logging.h&amp;gt;
#include &amp;lt;mutex&amp;gt;
#include &amp;lt;condition_variable&amp;gt;

class SignalHandler {
public:
    SignalHandler() = delete;

    st...]]></description><category></category></item><item><title><![CDATA[[C++采坑实录] Lambda按值捕获 和 array]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/83034124</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/83034124</guid><author>sai_j</author><pubDate>Fri, 12 Oct 2018 23:44:59 +0800</pubDate><description><![CDATA[背景 

一个学环境的朋友，正准备转码农，今天碰巧遇到一个Bug。

这里，我把代码简化之后，来看看到底哪里出现了问题？

 

代码


​
int main() {
    int collection[5] = {};

    auto process = [=]() {    // 按值捕获
        for(int i : collection)
            std:...]]></description><category></category></item><item><title><![CDATA[[N周N语言] C++实现Golang中的WaitGroup]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/83004304</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/83004304</guid><author>sai_j</author><pubDate>Wed, 10 Oct 2018 22:15:05 +0800</pubDate><description><![CDATA[class WaitGroup {
public:
    void Add(int incr = 1) {
        counter += incr;
    }

    void Done() {
        counter--;
        if (counter &amp;lt;= 0)
            cond.notify_all();
    }

    void ...]]></description><category></category></item><item><title><![CDATA[[C++11] 线程安全的BlockingQueue]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/83003421</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/83003421</guid><author>sai_j</author><pubDate>Wed, 10 Oct 2018 21:07:43 +0800</pubDate><description><![CDATA[参照muduo中的源码，使用C++11语法进行改写
#include &amp;lt;mutex&amp;gt;
#include &amp;lt;condition_variable&amp;gt;
#include &amp;lt;deque&amp;gt;

template &amp;lt;typename T&amp;gt;
class BlockingQueue {
public:
    BlockingQueue() : mutex_(), c...]]></description><category></category></item><item><title><![CDATA[[kafka] Kafka Docker单机环境搭建]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/82941271</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/82941271</guid><author>sai_j</author><pubDate>Tue, 09 Oct 2018 12:07:22 +0800</pubDate><description><![CDATA[Kafka搭建
docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka

docker run -d --name zookeeper  -p 2181:2181 -t wurstmeister/zookeeper 

docker run -d --name kafka --publish 9092:9092 \
--l...]]></description><category></category></item><item><title><![CDATA[[N周N语言] Golang for range，C++ auto for 遍历时是否可以删除元素？]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/82953813</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/82953813</guid><author>sai_j</author><pubDate>Sat, 06 Oct 2018 20:48:10 +0800</pubDate><description><![CDATA[先说下结论
Golang中的map，是可以在for range时删除元素的；但是，不能取元素的地址；
C++中的auto for，则是不支持删除元素的；

]]></description><category></category></item><item><title><![CDATA[[STL] lower_bound和upper_bound实现]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/82944706</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/82944706</guid><author>sai_j</author><pubDate>Fri, 05 Oct 2018 15:45:22 +0800</pubDate><description><![CDATA[int lower_bound(vector&amp;lt;int&amp;gt;&amp;amp; nums, int target) {
        int lo = 0, hi = nums.size() - 1;
        
        while (lo &amp;lt;= hi) {	// equal
            int mid = lo + (hi - lo) / 2;
     ...]]></description><category></category></item><item><title><![CDATA[[Leetcode] 124. Binary Tree Maximum Path Sum]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/82938255</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/82938255</guid><author>sai_j</author><pubDate>Thu, 04 Oct 2018 16:15:56 +0800</pubDate><description><![CDATA[Given a non-empty binary tree, find the maximum path sum.
For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connection...]]></description><category></category></item><item><title><![CDATA[[uService] Asynchronous Processing with Go using Kafka and MongoDB]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/82929619</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/82929619</guid><author>sai_j</author><pubDate>Wed, 03 Oct 2018 00:30:49 +0800</pubDate><description><![CDATA[参考文献：
https://www.melvinvivas.com/developing-microservices-using-kafka-and-mongodb/

]]></description><category></category></item><item><title><![CDATA[[C++] lock_guard vs unique_lock]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/82914636</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/82914636</guid><author>sai_j</author><pubDate>Mon, 01 Oct 2018 02:27:37 +0800</pubDate><description><![CDATA[
Lock doesn’t have to taken right at the construction, you can pass the flag std::defer_lock during its construction to keep the mutex unlocked during construction.

std::unique_lock&amp;lt;std::mutex&amp;gt;...]]></description><category></category></item><item><title><![CDATA[[C++11] 循环引用]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/82908241</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/82908241</guid><author>sai_j</author><pubDate>Sun, 30 Sep 2018 13:01:52 +0800</pubDate><description><![CDATA[前言
虽然C++11中的智能指针，一定程度上简化了C++当中的内存管理；但是，shared_ptr&amp;lt;&amp;gt;的使用同时也引出了另一个问题：循环引用。
例子
让我们先来看一段示例代码。
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;memory&amp;gt;

using namespace std;

class pa...]]></description><category></category></item><item><title><![CDATA[[Socket] listen()之backlog参数]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/82835309</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/82835309</guid><author>sai_j</author><pubDate>Tue, 25 Sep 2018 10:13:37 +0800</pubDate><description><![CDATA[直奔主题
The behavior of the backlog argument on TCP sockets changed with Linux 2.2.
Now it specifies the queue length for completely established sockets waiting  to  be
accepted,  instead of the number o...]]></description><category></category></item><item><title><![CDATA[[Linux] 内存映射IO]]></title><link>https://blog.youkuaiyun.com/sai_j/article/details/82833850</link><guid>https://blog.youkuaiyun.com/sai_j/article/details/82833850</guid><author>sai_j</author><pubDate>Tue, 25 Sep 2018 00:19:41 +0800</pubDate><description><![CDATA[前言
本科留给我最大的印象，就是大一愣头青死磕APUE。一眨眼，研究生阶段都快结束了。时间过的好快。上研究生之后，慢慢从C转到C++，Linux native API也用的越来越少。趁着最近面试这个机会，赶紧复习一下相关概念。
内存映射IO 的优势

使用内存映射IO来取代read()和write() 能简化代码逻辑，统一以内存的形式进行处理；
特定场景下，能提供更好的性能；

内存映射IO 为什...]]></description><category></category></item></channel></rss>