structc 開源框架簡介

来源:https://www.cnblogs.com/life2refuel/archive/2018/05/13/8361578.html
-Advertisement-
Play Games

瞭解 "structc https://github.com/wangzhione/structc" structc 是 C 構建基礎項目框架. 不是太驚艷, 但絕對是 C 簡單項目中一股清流. 它的前身是 simplec 框架. "simplec https://github.com/wangzh ...


瞭解

structc-https://github.com/wangzhione/structc

    structc 是 C 構建基礎項目框架. 不是太驚艷, 但絕對是 C 簡單項目中一股清流. 
它的前身是 simplec 框架. 

simplec - https://github.com/wangzhione/simplec

 二者相比. structc 框架更加自然. 力求貼合 C 項目開發的原始狀態.  所有寫的代碼, 心愿就是
向著標準庫, 操作系統, 編譯器靠攏!
例如下麵代碼
#ifndef _H_THREAD
#define _H_THREAD

#include <struct.h>
#include <pthread.h>
#include <semaphore.h>

//
// pthread_run - 非同步啟動線程
// id       : &tid 線程id地址
// frun     : 運行的主體
// arg      : 運行參數
// return   : 返回線程構建結果, 0 is success
//
#define pthread_run(id, frun, arg)                                  \
pthread_run_((id), (node_f)(frun), (void *)(intptr_t)(arg))
inline int pthread_run_(pthread_t * id, node_f frun, void * arg) {
    return pthread_create(id, NULL, (start_f)frun, arg);
}

//
// pthread_end - 等待啟動線程結束
// tid      : 線程id
// return   : void
//
inline void pthread_end(pthread_t tid) {
    pthread_join(tid, NULL);
}

//
// pthread_async - 非同步啟動分離線程
// frun     : 運行的主體
// arg      : 運行參數
// return   : 返回 0 is success
// 
#define pthread_async(frun, arg)                            \
pthread_async_((node_f)(frun), (void *)(intptr_t)(arg))

inline int pthread_async_(node_f frun, void * arg) {
    int ret;
    pthread_t tid;
    pthread_attr_t attr;

    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    ret = pthread_create(&tid, &attr, (start_f)frun, arg);
    pthread_attr_destroy(&attr);

    return ret;
}

#endif//_H_THREAD
有時候想問為什麼喜歡用 C 寫這些毫無營養的 東東. 在回答這個問題之前.

引述 golang.org 中一段代碼 
// You can edit this code!
// Click here and start typing.
package main

import "fmt"

func main() {
    fmt.Println("Hello, 世界")
}
(: 說 real 的, 在寫的溜語言中, 唯獨 Go 很好用, 但 * 真醜.)

猜測可能還是, C 有點意思 ~ 

借 - https://y.qq.com/n/yqq/song/002WLDmw0vkHtC.html

曾經多少個夜晚 在敲那些字元 printf("Hello World");

解說

    不妨說說 structc 的構成

 引進部分:   

    1. 記憶體池選用 jemalloc
    2. 復用 IO 選用 libuv
    3. 線程模型選用 pthtread  

補充部分 : 在 winds 爭取實現 linux 一樣的內容
       1. errno, strerror 機制
       2. socket 機制
       3. select / epoll 機制
       4. time 機制
       5. atom 機制
       ... ... 

核心部分

    1. mq.h     隊列      - https://github.com/wangzhione/structc/blob/master/structc/struct/mq.h
    2. dict.h   字典      - https://github.com/wangzhione/structc/blob/master/structc/struct/dict.h
    3. tstr.h   字元串     - https://github.com/wangzhione/structc/blob/master/structc/struct/tstr.h
    4. list.h   單鏈表     - https://github.com/wangzhione/structc/blob/master/structc/struct/list.h
    5. rtree.h  紅黑樹     - https://github.com/wangzhione/structc/blob/master/structc/struct/rtree.h 
    6. array.h  動態數組    - https://github.com/wangzhione/structc/blob/master/structc/struct/array.h

... ... 也許可以說, 數據結構 當前 仍是軟體設計的源頭吧. 

本文雖然作為 structc 拉粉的軟文. 但是感覺其中有些數據結構的設計思路很值得借鑒. 
例如 mq.h 中隊列 empty or full 思路
//
// pop empty  <=> tail == -1 ( head == 0 )
// push full  <=> head == tail + 1
//
struct mq {
    int head;           // 頭結點
    int tail;           // 尾結點
    int size;           // 隊列大小
    void ** queue;      // 隊列實體

    atom_t lock;        // 隊列原子鎖
    volatile bool fee;  // true表示銷毀狀態
};
dict.h 中關於素數表的引入
//
// primes - 質數表
//
const unsigned primes[][2] = {
    { (1<<6)-1  ,         53 },
    { (1<<7)-1  ,         97 },
    { (1<<8)-1  ,        193 },
    { (1<<9)-1  ,        389 },
    { (1<<10)-1 ,        769 },
    { (1<<11)-1 ,       1543 },
    { (1<<12)-1 ,       3079 },
    { (1<<13)-1 ,       6151 },
    { (1<<14)-1 ,      12289 },
    { (1<<15)-1 ,      24593 },
    { (1<<16)-1 ,      49157 },
    { (1<<17)-1 ,      98317 },
    { (1<<18)-1 ,     196613 },
    { (1<<19)-1 ,     393241 },
    { (1<<20)-1 ,     786433 },
    { (1<<21)-1 ,    1572869 },
    { (1<<22)-1 ,    3145739 },
    { (1<<23)-1 ,    6291469 },
    { (1<<24)-1 ,   12582917 },
    { (1<<25)-1 ,   25165843 },
    { (1<<26)-1 ,   50331653 },
    { (1<<27)-1 ,  100663319 },
    { (1<<28)-1 ,  201326611 },
    { (1<<29)-1 ,  402653189 },
    { (1<<30)-1 ,  805306457 },
    { UINT_MAX  , 1610612741 },
};
說起 (1<<6) - 1 不妨問問大家 (2 ^ 6) - 1 是多少 ? 是不是也很有意思 : )

或者 rtree.h 中 
//
// 紅黑樹通用結構, 需要將 $RTREE 放在結構開頭部位
//

struct $rtree {
    uintptr_t parentc;
    struct $rtree * left;
    struct $rtree * right;
};
等等 ... ... 不一一列舉. structc 的代碼很有實戰參照意義. 

有興趣的同學可以詳細看看, 順帶肉眼幫我提提 BUG, 在此表示感謝 . : )

後繼

    錯誤是難免的, 歡迎指正. 
這裡最後開啟程式員寫代碼模式, 跳個函數結尾  
// _str_printf : 成功直接返回
static char * _str_printf(const char * format, va_list arg) {
    char buf[BUFSIZ];
    int len = vsnprintf(buf, sizeof buf, format, arg);
    if (len < sizeof buf) {
        char * ret = malloc(len + 1);
        return memcpy(ret, buf, len + 1);
    }
    return NULL;
}

//
// str_printf - 字元串構建函數
// format   : 構建格式參照pritnf
// ...      : 參數集
// return   : char * 堆上記憶體
//
char * 
str_printf(const char * format, ...) {
    char * ret;
    int len, cap;
    va_list arg;
    va_start(arg, format);

    // BUFSIZ 以下記憶體直接分配
    ret = _str_printf(format, arg);
    if (ret != NULL)
        return ret;

    cap = BUFSIZ << 1;
    for (;;) {
        ret = malloc(cap);
        len = vsnprintf(ret, cap, format, arg);
        // 失敗的情況
        if (len < 0) {
            free(ret);
            return NULL;
        }

        // 成功情況
        if (len < cap)
            break;

        // 記憶體不足的情況
        free(ret);
        cap <<= 1;
    }

    return realloc(ret, len + 1);
}
人生 一塊開心 最好 : )

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 責任鏈模式,Chain of Responsibility,Java實現 ...
  • 需要實現的功能是:三級菜單1.從文本內讀出選項2.查詢每一級的選項,並能對選項進行增/刪/改功能3.每一級可以退出程式或者返回上一層思路三個操作模塊,分別是 增/刪/改 功能三個查詢模塊,分別對每一級別進行查詢報錯信息:Traceback (most recent call last): File  ...
  • 編程問題中相當大的一部分都可以通過使用順序編程來解決。 對於某些問題,如果能夠並行地執行程式中的多個部分,則會變得非常方便。 並行編程可以使程式執行速度得到極大地提高。 當並行執行的任務彼此開始產生互相干涉時,實際的併發問題就會接踵而至。 Web伺服器經常包含多個處理器,而併發是充分利用這些處理器的 ...
  • 手冊里可能有寫,但不是特別清晰,在這給個實例,有兩種方式: 1.多個入口文件: 將public下的index.php複製一份,粘貼、重命名為對應模塊的名字,如admin: 編輯admin.php的內容,修改模塊綁定的代碼: 之後訪問方式就是'功能變數名稱/admin.php',沒有映射功能變數名稱就是'localh ...
  • 一. Java多線程: Java給多線程編程提供了內置的支持。一條線程指的是進程中一個單一順序的控制流,一個進程中可以併發多個線程,每條線程並行執行不同的任務。 多線程是多任務的一種特別的形式,但多線程使用了更小的資源開銷。 這裡定義和線程相關的另一個術語--進程:一個進程包括由操作系統分配的記憶體空 ...
  • jenkins中集成commander應用 jenkins 集成測試 promotion 公司的應用較多,所以需要瞭解這幾種應用在jenkins中如何做構建,我自己參與的有兩種commander的應用,一種是大數據類的,一個是我們服務端架構組的scala應用 1、大數據應用BigData 配置如下: ...
  • 1、說一說Servlet的生命周期? Servlet有良好的生存期的定義,包括載入和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet介面的init(),service()和destroy方法表達。 Servlet被伺服器實例化後,容器運行其init方法,請 ...
  • "回到 DirectX11 使用Windows SDK來進行開發" "DirectX Tool Kit下載" DirectX Tool Kit是一個包含許多類的集合,用於為公共Windows平臺編寫Direct3D 11 C++代碼。裡面包含如下可用的頭文件(基本上都在名稱空間DirectX中): ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...