原创 Redis源碼分析——字典(dict)

Redis版本:5.0.5 文件:dict.h dict.c 字典概念 字典,又稱爲符號表,關聯數組或映射,是一種用於保存鍵值對的抽象數據結構。 在字典中,一個鍵可以和一個值進行關聯(或者說爲映射),這些關聯的鍵和值就稱爲鍵

原创 Redis源碼分析——intset 整數集合

Redis源碼:5.0.5 文件:intset.h intset.c 整數集合(intset)概念 整數集合(intset)是集合鍵的底層實現之一,當一個集合只包含整數值元素,並且這個集合的元素數量不多時,Redis就會使用整

原创 Redis源碼分析——跳躍表

Redis版本:5.0.5 文件: t_zset.c server.h 張老師講解redis中跳躍表的概念 跳躍表的實現C++ 本篇文章則針對源碼來進行分析 跳躍表(zskiplist zsiplistnode)概念 跳躍表

原创 函數名前加static的作用

static 先思考一個問題,static修飾一個變量的作用是什麼? 它的名字叫做局部靜態變量或者全局靜態變量,那這個變量到底可以幹什麼? 它有一個作用就是爲了讓該變量只在自己的編譯單元中可見。對於外部文件不可見。 編譯單元是

原创 c++11::shared_from_this()使用方法

shared_from_this() shared_from_this的使用方法: #include<iostream> #include<memory> class my_practice; void func1(std::

原创 Linux下如何使用gettid函數且和pthread_self()的區別

gettid 它被定義在<sys./types.h>頭文件中,但在程序中使用時發現沒有gettid函數。 我們可以自己封裝一下 #include<sys/syscall.h> syscall(SYS_gettid); //該

原创 C語言中的強符號與弱符號問題

弱符號與強符號 對於C/C++語言來說,編譯器默認函數和初始化了的全局變量爲強符號,未初始化的全局變量爲弱符號。我們也可以通過GCC的__attribute__((weak))將一個強符號變爲弱符號。強符號和弱符號都是針對定義來說

原创 Linux write()系統調用是否是原子性及其O_APPEND參數實驗驗證

基於該博客的結論進行實驗驗證 首先需要各位前去看鏈接中的博客,瞭解裏面的結論和知識點再來看我的實驗驗證。 write調用能保證的是,不管它實際寫入了多少數據,比如寫入了n字節數據,在寫入這n字節數據的時候,在所有共享文件描述符的

原创 利用shared_ptr和互斥鎖來模擬讀寫鎖

讀寫鎖 讀寫鎖有三種狀態:讀模式下加鎖狀態,寫模式下加鎖狀態,不加鎖狀態。一次只有一個線程可以佔有寫模式的讀寫鎖,但是多個線程可以同時佔有讀模式的讀寫鎖。當佔有讀寫鎖的讀鎖時,任何線程希望以寫模式對此鎖進行加鎖時都會阻塞,但是這種

原创 c++11多線程 std::async的使用總結

std::async #include<future> template<class Fn, class... Args> future<typename result_of<Fn(Args...)>::type> async(l

原创 淺談ELF文件

首先我們知道程序經過編譯器例如gcc,在打下gcc 1.c的時候經歷了什麼,分爲如下四步 預處理 主要處理那些以’#‘開始的指令 1、將所有#define展開 2、處理所有預編譯條件指令。#ifdef等 3、處理’#include

原创 淺談Linux內核與線程的關係及線程調度

首先,文章的開篇我們先看幾個概念 用戶級線程 用戶級線程顧名思義就是用戶態下的線程,用戶線程的建立,同步,銷燬,調度完全在用戶空間完成,不需要內核的幫助。因此這種線程的操作是極其快速的且低消耗的。 內核線程 內核級線程,是指由內核

原创 listen函數及其backlog參數的含義及實驗驗證

listen函數僅由TCP服務器調用,它做兩件事情 當socket函數創建一個套接字時,它被假設爲一個主動套接字,也就是說,它是一個將調用connect發起連接的客戶套接字。listen函數把一個未連接的套接字轉換成一個被動套接

原创 非阻塞connect詳解

我們先來講connect函數(本文針對的是TCP) #include<sys/socket.h> int connect(int sockfd, const struct sockaddr* servaddr, socklen_t

原创 Leetcode : 162題解析(C++)

題目鏈接 題目解析 本題意在一個數組中找出一個峯值,這個題目用暴力求解也可以去做,方法就是將數組遍歷一遍,然後找出其中一個峯值即可,但是其時間複雜度就會是O(n),而不是題目要求的O(logN)。 那我們就從另一個角度去分析該題,