最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pthread_once函數(shù)使用場景與原理

 更新時間:2025年12月25日 11:18:34   作者:RedmiUltra  
pthread_once 是 POSIX 線程庫中的一個函數(shù),主要用于確保某個初始化操作在多線程環(huán)境中只執(zhí)行一次,即使多個線程同時嘗試執(zhí)行該操作,本文就來介紹一下pthread_once函數(shù)使用場景與原理,感興趣的可以了解一下

pthread_once 是 POSIX 線程庫中的一個函數(shù),主要用于確保某個初始化操作在多線程環(huán)境中只執(zhí)行一次,即使多個線程同時嘗試執(zhí)行該操作。其核心設(shè)計目標(biāo)是提供線程安全的、高效的一次性初始化機制。

函數(shù)原型

#include <pthread.h>
int pthread_once(pthread_once_t *once_control, void (*init_routine)(void));
  • once_control:指向 pthread_once_t 類型變量的指針(需初始化為 PTHREAD_ONCE_INIT)。
  • init_routine:指向初始化函數(shù)的指針(無參數(shù)、無返回值)。
  • 返回值:成功返回 0,失敗返回錯誤碼。

核心作用與原理

  1. 線程安全的一次性執(zhí)行
    無論有多少線程調(diào)用 pthread_once,init_routine 函數(shù)只會被執(zhí)行一次(由第一個到達(dá)的線程執(zhí)行)。
  2. 同步機制
    后續(xù)調(diào)用的線程會阻塞等待,直到初始化函數(shù)執(zhí)行完畢,然后直接返回。
  3. 避免競態(tài)條件
    無需額外鎖機制即可保證初始化操作的原子性。

典型使用場景

1. 全局資源的初始化

#include <pthread.h>
#include <stdio.h>

// 全局初始化控制變量
static pthread_once_t once_control = PTHREAD_ONCE_INIT;
static int global_data;

void init_global_data() {
    global_data = 42; // 初始化全局?jǐn)?shù)據(jù)
    printf("Global data initialized!\n");
}

void* thread_func(void* arg) {
    pthread_once(&once_control, init_global_data); // 安全初始化
    printf("Thread %ld uses global_data=%d\n", (long)arg, global_data);
    return NULL;
}

int main() {
    pthread_t t1, t2;
    pthread_create(&t1, NULL, thread_func, (void*)1);
    pthread_create(&t2, NULL, thread_func, (void*)2);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    return 0;
}

輸出(初始化僅一次):

Global data initialized!
Thread 1 uses global_data=42
Thread 2 uses global_data=42

2. 單例模式實現(xiàn)

// 線程安全的單例初始化
Singleton* get_instance() {
    static pthread_once_t once = PTHREAD_ONCE_INIT;
    static Singleton* instance = NULL;
    
    void init_singleton() {
        instance = malloc(sizeof(Singleton));
        // ...初始化單例...
    }
    
    pthread_once(&once, init_singleton);
    return instance;
}

3. 延遲初始化(Lazy Initialization)

// 按需初始化全局配置
void load_config() {
    static pthread_once_t once = PTHREAD_ONCE_INIT;
    pthread_once(&once, read_config_file); // 首次調(diào)用時讀取配置文件
    // 使用配置...
}

4. 庫的初始化

// 動態(tài)庫中安全初始化內(nèi)部狀態(tài)
void lib_function() {
    static pthread_once_t lib_init_once = PTHREAD_ONCE_INIT;
    pthread_once(&lib_init_once, internal_lib_init);
    // ...其他操作...
}

關(guān)鍵注意事項

  1. once_control 必須靜態(tài)初始化

    pthread_once_t once_control = PTHREAD_ONCE_INIT; // 正確
    

    動態(tài)初始化(如運行時賦值)會導(dǎo)致未定義行為。

  2. 不可重置狀態(tài)
    once_control 的狀態(tài)是永久的,初始化完成后無法再次觸發(fā)。

  3. 避免遞歸調(diào)用
    不要在 init_routine 中嵌套調(diào)用 pthread_once,可能導(dǎo)致死鎖。

  4. 錯誤處理
    init_routine 崩潰,后續(xù)線程會因等待而阻塞。需確保初始化函數(shù)健壯性。

替代方案對比

方法優(yōu)點缺點
pthread_once無鎖、高效、簡潔狀態(tài)不可重置
互斥鎖 + 標(biāo)志位靈活(可重試、可重置)每次調(diào)用需加鎖,性能較低
C11 call_once跨平臺(C/C++標(biāo)準(zhǔn))需支持 C11 標(biāo)準(zhǔn)

總結(jié)

使用場景
? 需要線程安全的一次性初始化(如全局變量、單例、庫狀態(tài))。
? 希望避免顯式加鎖的開銷。
? 延遲初始化資源提升性能。

核心優(yōu)勢
通過內(nèi)核/編譯器級優(yōu)化,以最小代價實現(xiàn)線程安全的初始化,是 POSIX 多線程編程中的重要同步原語。

到此這篇關(guān)于pthread_once函數(shù)使用場景與原理的文章就介紹到這了,更多相關(guān)pthread_once函數(shù)使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ socket實現(xiàn)miniFTP

    C++ socket實現(xiàn)miniFTP

    這篇文章主要為大家詳細(xì)介紹了C++ socket實現(xiàn)miniFTP的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • C++數(shù)據(jù)結(jié)構(gòu)之哈希算法詳解

    C++數(shù)據(jù)結(jié)構(gòu)之哈希算法詳解

    這篇文章主要為大家詳細(xì)介紹了C++數(shù)據(jù)結(jié)構(gòu)中哈希算法的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,希望對大家有所幫助
    2022-12-12
  • C++移動語義介紹與使用講解

    C++移動語義介紹與使用講解

    首先,移動語義和完美轉(zhuǎn)發(fā)這兩個概念是在C++的模板編程的基礎(chǔ)上,新增的特性,主要是配合模板來使用。本篇會從C++的值類型,到移動拷貝與移動賦值來理解移動語義與完美轉(zhuǎn)發(fā)
    2022-09-09
  • C++實現(xiàn)LeetCode(90.子集合之二)

    C++實現(xiàn)LeetCode(90.子集合之二)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(90.子集合之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++ WideCharToMultiByte()函數(shù)案例詳解

    C++ WideCharToMultiByte()函數(shù)案例詳解

    這篇文章主要介紹了C++ WideCharToMultiByte()函數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言常量介紹

    C語言常量介紹

    這篇文章介紹了C語言中的常量,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • 利用C語言實現(xiàn)掃雷小游戲

    利用C語言實現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了利用C語言實現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • 使用c語言生成隨機數(shù)的示例分享

    使用c語言生成隨機數(shù)的示例分享

    在C語言中,rand()函數(shù)可以用來產(chǎn)生隨機數(shù),但是這不是真真意義上的隨機數(shù),是一個偽隨機數(shù),這篇文章主要介紹了使用c語言生成隨機數(shù)的示例,需要的朋友可以參考下
    2014-03-03
  • C++中檢查vector是否包含給定元素的幾種方式詳解

    C++中檢查vector是否包含給定元素的幾種方式詳解

    這篇文章主要介紹了C++中檢查vector是否包含給定元素的幾種方式,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • C++深入淺出探索數(shù)據(jù)結(jié)構(gòu)的原理

    C++深入淺出探索數(shù)據(jù)結(jié)構(gòu)的原理

    C++的數(shù)據(jù)結(jié)構(gòu)很多,很復(fù)雜,所以本文將通過示例帶大家深入了解一下C++中的數(shù)據(jù)結(jié)構(gòu)與算法。文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-05-05

最新評論

玛沁县| 柏乡县| 苏尼特右旗| 青铜峡市| 林甸县| 定安县| 兴隆县| 鹤庆县| 张家川| 文安县| 武邑县| 乌兰察布市| 柘城县| 海丰县| 彝良县| 晋州市| 特克斯县| 景德镇市| 仁寿县| 五峰| 连南| 阆中市| 安陆市| 稷山县| 商都县| 六枝特区| 天全县| 全椒县| 全南县| 南汇区| 嘉善县| 阿瓦提县| 新龙县| 封丘县| 温宿县| 德化县| 岚皋县| 利辛县| 昂仁县| 西青区| 宜兴市|