原创 線程同步機制——POSIX信號量、互斥量、條件變量

信號量 #include<semaphore.h> int sem_init(sem_t* sem, int pshared, unsigned int value); int sem_destory(sem_t* sem); i

原创 c++11線程的使用坑點總結

坑點總結 1、啓動了線程,你需要明確是要等待線程結束(調用join),還是讓其自主運行(調用detach)。如果std::thread對象銷燬之前還沒有做出決定,程序就會終止(std::thread的析構函數會調用std::ter

原创 linux創建進程do_fork()詳解

fork() fork 通過0x80中斷(系統調用)來陷入內核,由系統提供的相應系統調用來完成進程的創建。 //fork #ifdef __ARCH_WANT_SYS_FORK SYSCALL_DEFINE0(fork) { #i

原创 Muduo學習筆記—Eventloop Channel EPollPoller類

本篇文章在學習完Muduo之後來記錄自己對這幾個類的理解。如有理解不當的地方還請各位朋友指出,感激不盡! 我們先將這三個類的關係理清楚,然後我們再講解源碼的具體實現。 Eventloop類 Muduo是one loop per

原创 線程池(linux)

線程池 概念 線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然後在創建線程後自動啓動這些任務。線程池線程都是後臺線程。每個線程都使用默認的堆棧大小,以默認的優先級運行,並處於多線程單元中。我們將任務添加到任務隊列中,線程

原创 Linux線程實現機制

一.基礎知識:線程和進程 按照教科書上的定義,進程是資源管理的最小單位,線程是程序執行的最小單位。在操作系統設計上,從進程演化出線程,最主要的目的就是更好的支持SMP以及減小(進程/線程)上下文切換開銷。 無論按照怎樣的分法,一個

原创 進程池詳解(linux)

進程池 進程池是我們創建一組進程,進程數目可以自己的規定,目的是爲了讓我們可以併發的去處理任務,此文處理的是網絡請求的進程池。 採用的是半同步/半反應堆模式的進程池。 主進程epoll監聽listenfd,如有客戶連接根據特定算法

原创 記epoll_data_t中ptr使用的坑

先看一下epoll_data_t的結構 typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64; } epoll_data_t;

原创 二分查找(Binary search)

二分查找 概念 二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須採用順序存儲結構,而且表中元素按關鍵字有序排列。 二分查找有着驚人的查找速度 O(logn) 我們假設數據

原创 Leetcode 460 LFU緩存(C++實現)

題目描述 請你爲 最不經常使用(LFU)緩存算法設計並實現數據結構。它應該支持以下操作:get 和 put。 get(key) - 如果鍵存在於緩存中,則獲取鍵的值(總是正數),否則返回 -1。 put(key, value) -

原创 clone()函數及其與Linux線程實現的關係

#include<sched.h> int clone(int (*func)(void*), void *child_stack, int flags, void* fimc_arg ...); /* pid_t *ptid,

原创 從Linux內核談殭屍進程

殭屍進程 摘自百度百科: 殭屍進程是當子進程比父進程先結束,而父進程又沒有回收子進程,釋放子進程佔用的資源,此時子進程將成爲一個殭屍進程。如果父進程先退出 ,子進程被init接管,子進程退出後init會回收其佔用的相關資源。 在

原创 Leetcode : 105 C++題解

題目鏈接 題解鏈接 通俗易懂 #include<iostream> #include<vector> #include<algorithm> #include<memory> using namespace std; struc

原创 定時器詳解(定時器鏈表、時間輪、時間堆)

定時器(linux) 網絡程序需要處理定時事件,比如定期檢測一個客戶連接的活動狀態。服務器通常管理着衆多定時事件,因此有效的組織這些定時事件,使之能在預期的時間點被觸發且不影響服務器的主要邏輯,對於服務器性能有着至關重要的影響。爲

原创 函數的傳值傳址——指針篇

在我們寫代碼的時候,有時候我們去傳遞一個指針,想讓函數去修改他,有的時候可以,有的時候卻不行,那我們就要了解其中的原理。 先來看下面的代碼,讀者自己先思考一下函數的目的達到了嗎? #include<iostream> stru