97色伦色在线综合视频,无玛专区,18videosex性欧美黑色,日韩黄色电影免费在线观看,国产精品伦理一区二区三区,在线视频欧美日韩,亚洲欧美在线中文字幕不卡

網(wǎng)站建設(shè)的項目描述建可收費的網(wǎng)站

鶴壁市浩天電氣有限公司 2026/01/24 17:17:47
網(wǎng)站建設(shè)的項目描述,建可收費的網(wǎng)站,男女做那個視頻的網(wǎng)站,百度網(wǎng)盤登錄入口一、前言 前面我們了解了線程的基礎(chǔ)知識#xff0c;而在多線程編程中#xff0c;線程同步是核心技術(shù)#xff0c;用于解決多線程并發(fā)訪問共享資源時的競態(tài)條件#xff0c;保證數(shù)據(jù)一致性和線程執(zhí)行順序的可控性#xff1b;互斥鎖就是線程同步的其中一種機(jī)制。 二、線程同步…一、前言前面我們了解了線程的基礎(chǔ)知識而在多線程編程中線程同步是核心技術(shù)用于解決多線程并發(fā)訪問共享資源時的競態(tài)條件保證數(shù)據(jù)一致性和線程執(zhí)行順序的可控性互斥鎖就是線程同步的其中一種機(jī)制。二、線程同步2.1、線程同步的定義在一般情況下創(chuàng)建一個線程是不能提高程序的執(zhí)行效率的所以要創(chuàng)建多個線程。但是多個線程同時運行的時候可能調(diào)用線程函數(shù)在多個線程同時對同一個內(nèi)存地址進(jìn)行寫入由于CPU時間調(diào)度上的問題寫入數(shù)據(jù)會被多次的覆蓋所以就要使線程同步。線程共享進(jìn)程的地址空間全局變量、堆、文件描述符等當(dāng)多個線程同時讀寫「臨界資源」如全局變量、硬件設(shè)備、網(wǎng)絡(luò)連接時會導(dǎo)致數(shù)據(jù)錯亂。同步的目標(biāo)1、保護(hù)臨界資源同一時間只有一個線程訪問2、協(xié)調(diào)線程執(zhí)行順序如生產(chǎn)者生產(chǎn)完數(shù)據(jù)后消費者再消費。補(bǔ)臨界區(qū)訪問臨界資源的代碼段需被同步機(jī)制保護(hù)競態(tài)條件多線程并發(fā)執(zhí)行臨界區(qū)代碼導(dǎo)致結(jié)果依賴于線程執(zhí)行順序的不可控問題同步機(jī)制通過內(nèi)核 / 庫提供的接口限制臨界區(qū)的并發(fā)訪問、協(xié)調(diào)線程執(zhí)行時機(jī)。2.2、同步的目標(biāo)1、原子性保證臨界區(qū)代碼 “要么全執(zhí)行要么全不執(zhí)行”不可中斷2、可見性一個線程修改的共享變量其他線程能立即看到3、有序性保證線程按預(yù)期的順序執(zhí)行如生產(chǎn)者先生產(chǎn)消費者后消費。2.3、典型示例首先創(chuàng)建一個pthread_tb.c文件然后輸入以下代碼#include stdio.h #include pthread.h #include unistd.h int number;//共享全局變量 void *myfun1(void *arg) { for(int i0;i10000;i) { int ret; ret number; ret; number ret; printf(fun1 is %ld,number is %d ,pthread_self(),number); usleep(10);//微秒級睡眠 } } void *myfun2(void *arg) { for(int i0;i10000;i) { int ret; ret number; ret; number ret; printf(fun2 is %ld,number is %d ,pthread_self(),number); usleep(10); } } int main() { pthread_t pthid1; pthread_t pthid2; pthread_create(pthid1,NULL,myfun1,NULL);//線程創(chuàng)建 pthread_create(pthid2,NULL,myfun2,NULL); pthread_join(pthid1,NULL);//線程等待 pthread_join(pthid2,NULL); return 0; }編譯并運行結(jié)果如下看到這里可能會有疑問理論上運行完后number會運行到20000那為什么最終只有19803呢因為理論結(jié)果前提是20000 次自增都能被正確累加但你這段代碼里的“自增”并不是一條不可分割的操作而是讀加寫三步兩個線程一旦交叉執(zhí)行就會發(fā)生丟失更新導(dǎo)致很多次“1”被白白覆蓋掉假設(shè)某一刻number19780線程1執(zhí)行到ret number讀到ret 19780但還沒寫回發(fā)生線程切換線程也執(zhí)行到ret number也讀到ret19780線程2retnumberret寫回number 19781這次1生效再切回線程1線程1ret;numberret;也寫回 number19781把線程2的結(jié)果“覆蓋成同一個值”這兩次自增本該讓 number 變成19782結(jié)果只變成19781——少加了 1。這種“兩個線程讀到同一個舊值然后分別寫回同一個新值”的情況在你循環(huán) 20000 次里會發(fā)生很多很多次于是最終就會出現(xiàn)19803 20000。以上例子就是典型的反面案例。三、互斥鎖3.1、互斥鎖的定義互斥鎖是 Linux 多線程同步中最基礎(chǔ)、最常用的核心機(jī)制其核心目標(biāo)是保證同一時間只有一個線程能進(jìn)入 “臨界區(qū)”訪問共享資源的代碼段從而解決 “競態(tài)條件”保證共享資源的原子性、可見性和有序性。互斥鎖本質(zhì)是一個“二值鎖”狀態(tài)只有未鎖定與已鎖定。通過 “加鎖 - 訪問臨界區(qū) - 解鎖” 的閉環(huán)強(qiáng)制臨界區(qū)代碼原子執(zhí)行要么全執(zhí)行要么全不執(zhí)行不可被線程切換中斷。3.2、Linux互斥鎖的底層實現(xiàn)1、用戶態(tài)嘗試加鎖線程加鎖時先通過原子操作嘗試獲取鎖修改鎖的狀態(tài)2、成功則直接執(zhí)行若鎖未被持有加鎖成功直接進(jìn)入臨界區(qū)3、失敗則內(nèi)核態(tài)掛起若鎖已被持有線程進(jìn)入內(nèi)核態(tài)的 “等待隊列” 掛起放棄 CPU避免無意義的自旋4、解鎖時喚醒線程持有鎖的線程解鎖時若等待隊列有線程內(nèi)核會喚醒其中一個線程重新嘗試加鎖。補(bǔ)原子操作是指一個操作在執(zhí)行過程中不可被中斷、不可被其他線程打斷從而保證對共享數(shù)據(jù)的修改要么完整發(fā)生、要么完全不發(fā)生。3.3、互斥鎖的相關(guān)函數(shù)1、靜態(tài)初始化互斥鎖函數(shù)原型如下#include pthread.h // 靜態(tài)初始化全局互斥鎖 pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER;注靜態(tài)初始化的互斥鎖無需手動銷毀同一互斥鎖不能重復(fù)初始化已初始化的鎖再次調(diào)用 pthread_mutex_init 會導(dǎo)致未定義行為。2、動態(tài)初始化互斥鎖函數(shù)原型如下int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);參數(shù)mutex指向要初始化的互斥鎖對象不能為 NULLattr互斥鎖屬性NULL 表示使用默認(rèn)屬性返回值成功返回0失敗非0錯誤碼。3、阻塞加鎖函數(shù)原型如下int pthread_mutex_lock(pthread_mutex_t *mutex);參數(shù)mutex指向已初始化的互斥鎖對象。返回值成功0獲取到鎖失敗非0錯誤碼。功能若鎖未被持有當(dāng)前線程立即獲取鎖鎖狀態(tài)變?yōu)橐焰i定若鎖已被持有當(dāng)前線程放棄 CPU 使用權(quán)進(jìn)入內(nèi)核態(tài)等待隊列直到鎖被釋放。4、非阻塞加鎖函數(shù)原型如下int pthread_mutex_trylock(pthread_mutex_t *mutex);參數(shù)mutex指向已初始化的互斥鎖對象。返回值成功0 獲取到鎖失敗EBUSY鎖已被持有EINVAL鎖未初始化等。功能若鎖未被持有立即獲取并返回 0若鎖已被持有不阻塞直接返回EBUSY錯誤線程可執(zhí)行其他邏輯。適用場景不想讓線程阻塞等待鎖的場景。5、解鎖函數(shù)原型如下int pthread_mutex_unlock(pthread_mutex_t *mutex);參數(shù)mutex指向已初始化的互斥鎖對象。返回值成功0失敗非 0 錯誤碼。功能釋放當(dāng)前線程持有的鎖注只有持有鎖的線程能解鎖解鎖未加鎖的鎖會觸發(fā)錯誤。6、銷毀互斥鎖函數(shù)原型如下int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);功能銷毀屬性對象釋放其占用的資源必須與pthread_mutex_init 配對使用。3.4、典型示例接上一個線程同步的反面案例通過互斥鎖的形式來實現(xiàn)線程的同步具體代碼如下所示#include stdio.h #include pthread.h #include unistd.h int number; pthread_mutex_t mutex; void *myfun1(void *arg) { for(int i0;i10000;i) { //lock pthread_mutex_lock(mutex); int ret; ret number; ret; number ret; printf(fun1 is %ld,number is %d ,pthread_self(),number); //ulock pthread_mutex_unlock(mutex); usleep(10); } } void *myfun2(void *arg) { for(int i0;i10000;i) { //lock pthread_mutex_lock(mutex); int ret; ret number; ret; number ret; printf(fun2 is %ld,number is %d ,pthread_self(),number); //ulock pthread_mutex_unlock(mutex); usleep(10); } } int main() { //init mutex pthread_mutex_init(mutex,NULL); pthread_t pthid1; pthread_t pthid2; pthread_create(pthid1,NULL,myfun1,NULL); pthread_create(pthid2,NULL,myfun2,NULL); pthread_join(pthid1,NULL); pthread_join(pthid2,NULL); //kill mutex pthread_mutex_destroy(mutex); return 0; }編譯并運行結(jié)果如下可以看到通過互斥鎖來實現(xiàn)了線程的同步避免了線程之間的競爭關(guān)系。
版權(quán)聲明: 本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請聯(lián)系我們進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

中鐵集團(tuán)網(wǎng)站建設(shè)怎么做海淘網(wǎng)站

中鐵集團(tuán)網(wǎng)站建設(shè),怎么做海淘網(wǎng)站,asp網(wǎng)站上傳后臺在哪,2345瀏覽器主頁網(wǎng)址第一章#xff1a;AI Agent 部署性能測試概述在現(xiàn)代人工智能系統(tǒng)開發(fā)中#xff0c;AI Agent 的部署性能

2026/01/23 02:18:01

福州seo公司網(wǎng)站做網(wǎng)站最好用的軟件

福州seo公司網(wǎng)站,做網(wǎng)站最好用的軟件,wordpress如何作頁面,南陽專業(yè)做網(wǎng)站Langchain-Chatchat如何實現(xiàn)文檔來源標(biāo)注與引用追蹤 在企業(yè)知識管理日益復(fù)雜的今天#xff0c;一個常

2026/01/23 13:58:02

網(wǎng)站的英文版怎么做的移動網(wǎng)站系統(tǒng)

網(wǎng)站的英文版怎么做的,移動網(wǎng)站系統(tǒng),什么是wordpress靜態(tài)化,網(wǎng)站上的縮略圖怎么做清晰LUT調(diào)色包下載后怎么用#xff1f;結(jié)合lora-scripts訓(xùn)練影視級風(fēng)格遷移模型 在數(shù)字內(nèi)容創(chuàng)作愈發(fā)

2026/01/23 14:39:01