色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

valgrind基本功能介紹、基礎(chǔ)使用方法說(shuō)明

嵌入式與Linux那些事 ? 來(lái)源:嵌入式與Linux那些事 ? 作者:嵌入式與Linux那些 ? 2022-11-14 12:40 ? 次閱讀

1、Valgrind概述

Valgrind是一套Linux下,開放源代碼(GPL V2)的仿真調(diào)試工具的集合。

Valgrind由內(nèi)核(core)以及基于內(nèi)核的其他調(diào)試工具組成。內(nèi)核類似于一個(gè)框架(framework),它模擬了一個(gè)CPU環(huán)境,并提供服務(wù)給其他工具;而其他工具則類似于插件 (plug-in),利用內(nèi)核提供的服務(wù)完成各種特定的內(nèi)存調(diào)試任務(wù)。

85e2d876-63d2-11ed-8abf-dac502259ad0.png

2、工具下載安裝

參考地址:https://www.valgrind.org/downloads/

安裝:

tar–xfvalgrind-3.17.0.tar.bz2
cdvalgrind-3.17.0
./configure//運(yùn)行配置腳本生成makefile文件,可以--help查看配置項(xiàng),自行按需配置,比如修改編譯工具、修改安裝路徑等
make
makeinstall//安裝生成可執(zhí)行文件,可執(zhí)行文件的路徑有參數(shù)--prefix指定,需要在PATH中添加環(huán)境變量;若不加參數(shù)--prefix指定,僅使用默認(rèn)配置,則會(huì)自動(dòng)關(guān)聯(lián)

安裝完后可以使用:

valgrind --help查看使用方法

3、使用基本選項(xiàng)

3.1 基本工具介紹

Memcheck。這是valgrind應(yīng)用最廣泛的工具,一個(gè)重量級(jí)的內(nèi)存檢查器,能夠發(fā)現(xiàn)開發(fā)中絕大多數(shù)內(nèi)存錯(cuò)誤使用情況,比如:使用未初始化的內(nèi)存,使用已經(jīng)釋放了的內(nèi)存,內(nèi)存訪問(wèn)越界等。這也是本文將重點(diǎn)介紹的部分。

Callgrind。它主要用來(lái)檢查程序中函數(shù)調(diào)用過(guò)程中出現(xiàn)的問(wèn)題。

Cachegrind。它主要用來(lái)檢查程序中緩存使用出現(xiàn)的問(wèn)題。

Helgrind。它主要用來(lái)檢查多線程程序中出現(xiàn)的競(jìng)爭(zhēng)問(wèn)題。

Massif。它主要用來(lái)檢查程序中堆棧使用中出現(xiàn)的問(wèn)題。

Extension。可以利用core提供的功能,自己編寫特定的內(nèi)存調(diào)試工具

3.2 常用選項(xiàng)

適用于所有Valgrind工具

–tool=最常用的選項(xiàng)。運(yùn)行valgrind中名為toolname的工具。默認(rèn)memcheck。
-h--help顯示幫助信息。
–version顯示valgrind內(nèi)核的版本,每個(gè)工具都有各自的版本。
-q--quiet安靜地運(yùn)行,只打印錯(cuò)誤信息。
-v--verbose更詳細(xì)的信息,增加錯(cuò)誤數(shù)統(tǒng)計(jì)。
–trace-children=no|yes跟蹤子線程?[no]
–track-fds=no|yes跟蹤打開的文件描述?[no]
–time-stamp=no|yes增加時(shí)間戳到LOG信息?[no]
–log-fd=輸出LOG到描述符文件[2=stderr]
–log-file=將輸出的信息寫入到filename.PID的文件里,PID是運(yùn)行程序的進(jìn)行ID
–log-file-exactly=輸出LOG信息到file
–log-file-qualifier=取得環(huán)境變量的值來(lái)做為輸出信息的文件名。[none]
–log-socket=ipaddr:port輸出LOG到socket,ipaddr:port

LOG信息輸出

–xml=yes將信息以xml格式輸出,只有memcheck可用
–num-callers=showcallersinstacktraces[12]
–error-limit=no|yes如果太多錯(cuò)誤,則停止顯示新錯(cuò)誤?[yes]
–error-exitcode=如果發(fā)現(xiàn)錯(cuò)誤則返回錯(cuò)誤代碼[0=disable]
–db-attach=no|yes當(dāng)出現(xiàn)錯(cuò)誤,valgrind會(huì)自動(dòng)啟動(dòng)調(diào)試器gdb。[no]
–db-command=啟動(dòng)調(diào)試器的命令行選項(xiàng)[gdb-nw%f%p]

適用于Memcheck工具的相關(guān)選項(xiàng):

–leak-check=no|summary|full要求對(duì)leak給出詳細(xì)信息?[summary]
–leak-resolution=low|med|highhowmuchbtmerginginleakcheck[low]
–show-reachable=no|yesshowreachableblocksinleakcheck?[no]

更詳細(xì)的使用信息詳見幫助文件、man手冊(cè)或官網(wǎng):http://valgrind.org/docs/manual/manual-core.html

注意

(1)valgrind不會(huì)自動(dòng)的檢查程序的每一行代碼,只會(huì)檢查運(yùn)行到的代碼分支,所以單元測(cè)試或功能測(cè)試用例很重要;

(2)可以把valgrind看成是一個(gè)sandbox,通過(guò)valgrind運(yùn)行的程序?qū)嶋H上是運(yùn)行在valgrind的sandbox中的,所以,不要測(cè)試性能,會(huì)讓你失望的,建議只做功能測(cè)試

(3)編譯代碼時(shí),建議增加-g -o0選項(xiàng),不要使用-o1、-o2選項(xiàng)

3.3 常用選項(xiàng)示例

–tool=< name > : use the Valgrind tool named < name > [memcheck]–log-file=< file > : log messages to < file >

示例:

valgrind--tool=memcheck--log-file=log.txt--leak-check=yes./test

說(shuō)明:使用memcheck工具對(duì)test程序進(jìn)行包含內(nèi)存泄漏的檢查,并將日志保存到log.txt

4、Memcheck工具介紹

Memcheck是valgrind應(yīng)用最廣泛的工具,能夠發(fā)現(xiàn)開發(fā)中絕大多數(shù)內(nèi)存錯(cuò)誤使用情況。此工具主要可檢查以下錯(cuò)誤

使用未初始化的內(nèi)存(Use of uninitialised memory)

使用已經(jīng)釋放了的內(nèi)存(Reading/writing memory after it has been free’d)

使用超過(guò)malloc分配的內(nèi)存空間(Reading/writing off the end of malloc’d blocks)

對(duì)堆棧的非法訪問(wèn)(Reading/writing inappropriate areas on the stack)

申請(qǐng)的空間是否有釋放(Memory leaks – where pointers to malloc’d blocks are lost forever)

malloc/free/new/delete申請(qǐng)和釋放內(nèi)存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])

src和dst的重疊(Overlapping src and dst pointers in memcpy() and related functions)

#include
intmain()
{
int*pInt;
std::cout<<"使用未初始化的內(nèi)存";
?int?a=*pInt;????//使用未初始化的內(nèi)存
}

#include
intmain()
{
int*pArray=(int*)malloc(sizeof(int)*5);
std::cout<<"使用已經(jīng)釋放了的內(nèi)存";
?free(pArray);
?pArray[0]=0;????//使用已經(jīng)釋放了的內(nèi)存
}

#include
intmain()
{
int*pArray=(int*)malloc(sizeof(int)*5);
std::cout<<"使用超過(guò)malloc分配的內(nèi)存空間";
?pArray[5]=5;????//使用超過(guò)malloc分配的內(nèi)存空間
?free(pArray);
}

#include
intmain()
{
int*pArray=(int*)malloc(sizeof(int)*5);
std::cout<<"malloc缺少free";
}

#include
intmain()
{
chara[10];
for(charc=0;c

注:程序有時(shí)會(huì)申請(qǐng)很多常駐節(jié)點(diǎn),這些未釋放的節(jié)點(diǎn)不應(yīng)視為問(wèn)題;

一般隨著程序的運(yùn)行,導(dǎo)致節(jié)點(diǎn)單向增加的malloc或new操作,視為內(nèi)存泄漏

4.1 示例1

源碼:

#include
intmain()
{
int*pArray=(int*)malloc(sizeof(int)*5);
std::cout<<"使用超過(guò)malloc分配的內(nèi)存空間";
?pArray[5]=5;????//使用超過(guò)malloc分配的內(nèi)存空間
?free(pArray);
}
12345678

編譯:

g++test1.cpp-g-otest1_g//-g:讓memcheck工具可以取到出錯(cuò)的具體行號(hào)

調(diào)試:

valgrind--leak-check=yes--log-file=1_g./test1_g

生成日志文件1_g:

85f7dbea-63d2-11ed-8abf-dac502259ad0.png

(1)當(dāng)前程序(./test1_g)的進(jìn)程號(hào)

(2)valgrind memcheck工具的license說(shuō)明

(3)加載程序的運(yùn)行方式

(4)父進(jìn)程號(hào),當(dāng)前終端的進(jìn)程

(5)檢測(cè)到的錯(cuò)誤信息

(6)堆棧摘要、小結(jié),該例子中總共兩次alloc、兩次free,沒(méi)有內(nèi)存泄漏

(7) 檢測(cè)到的錯(cuò)誤數(shù)量,這里提示1個(gè)

4.2 示例2

#include
intmain()
{
int*pArray=(int*)malloc(sizeof(int)*5);
std::cout<<"使用已經(jīng)釋放了的內(nèi)存";
?free(pArray);
?pArray[0]=0;????//使用已經(jīng)釋放了的內(nèi)存
}

編譯:

g++test7.cpp-g-otest7_g//-g:讓memcheck工具可以取到出錯(cuò)的具體行號(hào)

調(diào)試:

valgrind--leak-check=yes--log-file=7_g./test7_g

生成日志文件7_g:

86286526-63d2-11ed-8abf-dac502259ad0.png

(1)因?yàn)檫€是使用同一個(gè)終端,所以父進(jìn)程還是8248

(2) 有兩個(gè)非法的讀、寫錯(cuò)誤

編譯:

g++test7.cpp-g-otest2_g_O2-O2

調(diào)試:

valgrind--leak-check=yes--log-file=7_g_O2./test7_g_O2

生成日志文件7_g_O2:

867a9666-63d2-11ed-8abf-dac502259ad0.png

可以看到同樣的程序,在加上-O2之后,pArray[0]=0;語(yǔ)句被優(yōu)化掉了,所以沒(méi)有被檢測(cè)出來(lái)。

為了做到更嚴(yán)格的檢測(cè),編譯時(shí)需要保證編譯器沒(méi)有做優(yōu)化,即優(yōu)化等級(jí)為-O0,gcc、g++默認(rèn)就是采用-O0的,但是大部分實(shí)際設(shè)計(jì)都會(huì)在Makefile中添加-O1或者-O2參數(shù),所以最好還是檢查下。

4.3 Memcheck 報(bào)告輸出文檔整體格式總結(jié)

86286526-63d2-11ed-8abf-dac502259ad0.png

copyright 版權(quán)聲明

異常讀寫報(bào)告2.1 主線程異常讀寫

線程A異常讀寫報(bào)告線程B異常讀寫報(bào)告

其他線程

堆內(nèi)存泄露報(bào)告4.1 堆內(nèi)存使用情況概述(HEAP SUMMARY)

4.2 確信的內(nèi)存泄露報(bào)告(definitely lost)

4.3 可疑內(nèi)存操作報(bào)告 (show-reachable=no關(guān)閉,打開:–show-reachable=yes)

4.4 泄露情況概述(LEAK SUMMARY)

4.4 Memcheck 日志報(bào)告的基本格式

86e1ba26-63d2-11ed-8abf-dac502259ad0.png

{問(wèn)題描述}
at{地址、函數(shù)名、模塊或代碼行}
by{地址、函數(shù)名、代碼行}
by…{逐層依次顯示調(diào)用堆棧}
Address0x???{描述地址的相對(duì)關(guān)系}

4.5 memcheck包含的7類錯(cuò)誤

illegal read/illegal write errors提示信息:[invalid read of size 4]

use of uninitialised values提示信息:[Conditional jump or move depends on uninitialised value]

use of uninitialised or unaddressable values in system calls提示信息:[syscall param write(buf) points to uninitilaised bytes]

illegal frees提示信息:[invalid free()]

when a heap block is freed with an inappropriate deallocation function提示信息:[Mismatched free()/delete/delete[]]

overlapping source and destination blocks提示信息:[source and destination overlap in memcpy(,)]

memory leak detection① still reachable內(nèi)存指針還在還有機(jī)會(huì)使用或釋放,指針指向的動(dòng)態(tài)內(nèi)存還沒(méi)有被釋放就退出了

② definitely lost確定的內(nèi)存泄露,已經(jīng)不能訪問(wèn)這塊內(nèi)存

③ indirectly lost指向該內(nèi)存的指針都位于內(nèi)存泄露處

④ possibly lost可能的內(nèi)存泄露,仍然存在某個(gè)指針能夠快速訪問(wèn)某塊內(nèi)存,但該指針指向的已經(jīng)不是內(nèi)存首位置

4.6 memcheck工具原理

Memcheck實(shí)現(xiàn)了一個(gè)仿真的CPU,被監(jiān)控的程序被這個(gè)仿真CPU解釋執(zhí)行,該仿真CPU可以在所有的內(nèi)存讀寫指令發(fā)生時(shí),檢測(cè)地址的合法性和讀操作的合法性。

86f9b87e-63d2-11ed-8abf-dac502259ad0.png

Memcheck 能夠檢測(cè)出內(nèi)存問(wèn)題,關(guān)鍵在于其建立了兩個(gè)全局表。

Valid-Value 表:

對(duì)于進(jìn)程的整個(gè)地址空間中的每一個(gè)字節(jié)(byte),都有與之對(duì)應(yīng)的8 個(gè)bits;對(duì)于CPU 的每個(gè)寄存器,也有一個(gè)與之對(duì)應(yīng)的bit 向量。這些bits 負(fù)責(zé)記錄該字節(jié)或者寄存器值是否具有有效的、已初始化的值。

Valid-Address 表

對(duì)于進(jìn)程整個(gè)地址空間中的每一個(gè)字節(jié)(byte),還有與之對(duì)應(yīng)的1 個(gè)bit,負(fù)責(zé)記錄該地址是否能夠被讀寫。

檢測(cè)原理:

當(dāng)要讀寫內(nèi)存中某個(gè)字節(jié)時(shí),首先檢查這個(gè)字節(jié)對(duì)應(yīng)的A bit。如果該A bit顯示該位置是無(wú)效位置,memcheck 則報(bào)告讀寫錯(cuò)誤。

內(nèi)核(core)類似于一個(gè)虛擬的CPU 環(huán)境,這樣當(dāng)內(nèi)存中的某個(gè)字節(jié)被加載到真實(shí)的CPU 中時(shí),該字節(jié)對(duì)應(yīng)的V bit 也被加載到虛擬的

CPU 環(huán)境中。一旦寄存器中的值,被用來(lái)產(chǎn)生內(nèi)存地址,或者該值能夠影響程序輸出,則memcheck 會(huì)檢查對(duì)應(yīng)的V bits,如果該值

尚未初始化,則會(huì)報(bào)告使用未初始化內(nèi)存錯(cuò)誤。

簡(jiǎn)單來(lái)說(shuō)

如何知道那些地址是合法的(內(nèi)存已分配)?維護(hù)一張合法地址表(Valid-address (A) bits),當(dāng)前所有可以合法讀寫(已分配)的地址在其中有對(duì)應(yīng)的表項(xiàng)。該表通過(guò)以下措施維護(hù):

① 全局?jǐn)?shù)據(jù)(data, bss section)–在程序啟動(dòng)的時(shí)候標(biāo)記為合法地址

② 局部變量–監(jiān)控sp(stack pointer)的變化,動(dòng)態(tài)維護(hù)

③動(dòng)態(tài)分配的內(nèi)存–截獲 分配/釋放 內(nèi)存的調(diào)用:malloc, calloc, realloc, valloc, memalign, free, new, new[], delete and delete[]

④ 系統(tǒng)調(diào)用–截獲mmap映射的地址

⑤ 其他–可以顯示知會(huì)memcheck某地字段是合法的

如何知道某內(nèi)存是否已經(jīng)被賦值?

①維護(hù)一張合法值表(Valid-value (V) bits),指示對(duì)應(yīng)的bit是否已經(jīng)被賦值。因?yàn)樘摂MCPU可以捕獲所有對(duì)內(nèi)存的寫指令,所以這張表很容易維護(hù)。

5、Callgrind工具介紹

Callgrind性能分析工具,它不需要在編譯源碼時(shí)附加特殊選項(xiàng)。Callgrind使用cachegrind的統(tǒng)計(jì)信息Ir(I cache reads,即一條指令執(zhí)行的次數(shù))來(lái)統(tǒng)計(jì)程序中函數(shù)的調(diào)用情況,建立函數(shù)調(diào)用關(guān)系圖,還可以有選擇地進(jìn)行cache模擬。在運(yùn)行結(jié)束時(shí),它會(huì)把分析數(shù)據(jù)寫入一個(gè)文件,callgrind_annotate可以把這個(gè)文件的內(nèi)容轉(zhuǎn)化成可讀的形式。

5.1 Callgrind文本分析基本操作

示例:

(1)

cdlinux/bin
valgrind--tool=callgrind./Devtest

生成一個(gè)文件:callgrind.out.27439

或者

valgrind--tool=callgrind--separate-threads=yes./Devtest

生成三個(gè)文件:callgrind.out.1234(為空),callgrind.out.1234-01(線程1),callgrind.out.1234-02(線程2)

(2)

callgrind_annotatecallgrind.out.27439>log

callgrind_annotate是可以將callgrind.out.pid文件的內(nèi)容轉(zhuǎn)化為可讀的形式,并重定向到log文件,分別打開callgrind.out.pid、log文件,你會(huì)發(fā)現(xiàn)它們的不同(callgrind.out.pid是人類不便于直接理解的格式,callgrind_annotate相當(dāng)于一個(gè)翻譯,將callgrind.out.pid按照我們喜歡的方式展現(xiàn)出來(lái))。

callgrind_annotate解析callgrind.out.pid而生成的log文件,打開后內(nèi)容如下:

87200b50-63d2-11ed-8abf-dac502259ad0.png

可以看到每個(gè)函數(shù)所屬的動(dòng)態(tài)庫(kù),該函數(shù)調(diào)用所耗費(fèi)的指令數(shù),默認(rèn)是從大到小排序的。

callgrind_annotate 還有幾個(gè)可選參數(shù):

--inclusive=yes:不但分別統(tǒng)計(jì)每個(gè)語(yǔ)句的執(zhí)行次數(shù),還把調(diào)用關(guān)系計(jì)算進(jìn)入,比如函數(shù)foo調(diào)用了bar,那么foo的代價(jià)中會(huì)加入bar的代價(jià)。

--tree=both:顯示調(diào)用關(guān)系。

--auto=yes:會(huì)自動(dòng)將統(tǒng)計(jì)信息和源碼關(guān)聯(lián)。就是會(huì)顯示每個(gè)函數(shù)的源碼,并且在前面顯示每條語(yǔ)句的運(yùn)行代價(jià)

(3)可以對(duì)單獨(dú)的文件進(jìn)行關(guān)聯(lián):

callgrind_annotatecallgrind.out.9441main.c|grep-v“???”

注:“???”前綴的調(diào)用,都是系統(tǒng)庫(kù)底層調(diào)用,不重要,可用grep -v過(guò)濾掉

5.2 Callgrind流程圖分析基本操作

以工程右圖“官網(wǎng)提供的示例代碼”為例,會(huì)比較直觀:

gcc–gtest.c-otest
valgrind--tool=callgrind./test

生成一個(gè)文件:callgrind.out.pid

pythongprof2dot.py-fcallgrind-n10-scallgrind.out.[pid]>valgrind.dot
dot-Tpngvalgrind.dot-ovalgrind.png

打開圖片打開,據(jù)說(shuō)能一目了然的知道運(yùn)行時(shí)間消耗的分布

876a4b66-63d2-11ed-8abf-dac502259ad0.png8783d766-63d2-11ed-8abf-dac502259ad0.png

6、Cachegrind工具介紹

6.1 基本介紹

Cachegrind基于Valgrind的剖析器(profiler)計(jì)算機(jī)系統(tǒng)變得越來(lái)越復(fù)雜,剖析存儲(chǔ)系統(tǒng)往往是系統(tǒng)瓶頸,需要剖析Cache

功能

模擬L1、L2 Cache

剖析Cache行為,執(zhí)行次數(shù)、失效率等

按照文件、函數(shù)、代碼行、匯編指令剖析

作用

詳細(xì)Cache剖析,發(fā)現(xiàn)程序瓶頸

指令改進(jìn)程序,提高執(zhí)行效率

Trace驅(qū)動(dòng)的Cache模擬器

優(yōu)點(diǎn)

容易使用,不需要重新編譯

剖析所有執(zhí)行的代碼,包括庫(kù)

不限定語(yǔ)言

速度相對(duì)較快

靈活,模擬不同配置的Cache

6.2 使用步驟

valgrind--tool=cachegrind./test
879b19e4-63d2-11ed-8abf-dac502259ad0.png

同時(shí)生成文件cachegrind.out.pid

callgrind_annotatecachegrind.out.4599|grep-v“???”
87c0f33a-63d2-11ed-8abf-dac502259ad0.png在這里插入圖片描述

和callgrind一樣,也可以通過(guò)callgrind_annotate翻譯為可讀信息。從中可以看到I1 cache(指令緩存)、D1 cache(數(shù)據(jù)緩存)、LL cache(公共的二級(jí)緩存)的命中情況。

7、Massif工具介紹

Massif是一個(gè)內(nèi)存剖析工具。通過(guò)不斷的取程序堆的快照來(lái)達(dá)到監(jiān)視程序內(nèi)存分配的目的。

7.1 示例

g++test.cc-otest
valgrind--tool=massif./test

就得到一個(gè)massif文件:massif.out.pid

使用ms_print來(lái)解析這個(gè)輸出文件:

ms_printmassif.out.pid

通過(guò)圖形快照看出堆棧的內(nèi)存變化情況:

87e60b66-63d2-11ed-8abf-dac502259ad0.png8807f79e-63d2-11ed-8abf-dac502259ad0.png

8、Helgrind工具介紹

Helgrind是Valgrind的一個(gè)重點(diǎn)功能 本節(jié)主要針對(duì)與多線程基本安全問(wèn)題進(jìn)行檢測(cè)。

資源不安全訪問(wèn)

死鎖問(wèn)題

POSIX pthreads API的錯(cuò)誤使用

在前面幾個(gè)基礎(chǔ)上都能安全無(wú)誤的情況下 多于多線程程序就是要能夠能好將同步塊盡量縮到最小

8.1 Helgrind 資源不安全訪問(wèn)

解決問(wèn)題:

問(wèn)題1: 調(diào)用Helgrind能夠很好的解決掉,以右邊基本程序?yàn)槔?/p>

#include

intvar=0;
void*child_fn(void*arg)
{
var++;
returnNULL;
}
intmain(void)
{
pthread_tchild;
pthread_tchild2;

pthread_create(&child,NULL,child_fn,NULL);
pthread_create(&child2,NULL,child_fn,NULL);

pthread_join(child,NULL);
pthread_join(child2,NULL);

return0;
}
123456789101112131415161718192021

明顯var是共享的 不安全訪問(wèn),調(diào)用Helgrind看看怎么能夠檢測(cè)出來(lái):

gcc-gtest.c-otest–lpthread
valgrind--tool=helgrind./test

運(yùn)行helgrind之后會(huì)生成如下結(jié)果,從信息提示中可以看到有兩個(gè)錯(cuò)誤,對(duì)val全局變量的搶占使用

889e93fc-63d2-11ed-8abf-dac502259ad0.png88c93e54-63d2-11ed-8abf-dac502259ad0.png

問(wèn)題2:

死鎖問(wèn)題是盡量避免,helgrind可以檢測(cè)出加鎖解鎖順序出現(xiàn)問(wèn)題導(dǎo)致的死鎖問(wèn)題,這個(gè)問(wèn)題我們可以好好看下:https://blog.csdn.net/sfwtoms11/article/details/38438253

再看下連續(xù)加2次鎖的情況

#include

pthread_mutex_tmut_thread;
intvar=0;
void*child_fn(void*arg)
{
pthread_mutex_lock(&mut_thread);
var++;
pthread_mutex_lock(&mut_thread);
returnNULL;
}

intmain(void)
{
pthread_tchild;
pthread_tchild2;
pthread_mutex_init(&mut_thread,NULL);
pthread_create(&child,NULL,child_fn,NULL);
pthread_create(&child2,NULL,child_fn,NULL);
pthread_join(child,NULL);
pthread_join(child2,NULL);
return0;
}
1234567891011121314151617181920212223

mutex加解鎖順序?qū)е碌膯?wèn)題:

#include

pthread_mutex_tmut_thread;
pthread_mutex_tmut_thread1;
intvar=0;
void*child_fn(void*arg){
pthread_mutex_lock(&mut_thread);
pthread_mutex_lock(&mut_thread1);
var++;
pthread_mutex_unlock(&mut_thread);
pthread_mutex_unlock(&mut_thread1);
returnNULL;
}
void*child_fn1(void*arg)
{
pthread_mutex_lock(&mut_thread1);
pthread_mutex_lock(&mut_thread);
var++;
pthread_mutex_unlock(&mut_thread1);
pthread_mutex_unlock(&mut_thread);
returnNULL;
}

intmain(void){
pthread_tchild;
pthread_tchild2;
pthread_mutex_init(&mut_thread,NULL);
pthread_mutex_init(&mut_thread1,NULL);
pthread_create(&child,NULL,child_fn,NULL);
pthread_create(&child2,NULL,child_fn1,NULL);
pthread_join(child,NULL);
pthread_join(child2,NULL);
return0;
}

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11292

    瀏覽量

    209328
  • Valgrind
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    6807

原文標(biāo)題:valgrind基本功能介紹、基礎(chǔ)使用方法說(shuō)明

文章出處:【微信號(hào):嵌入式與Linux那些事,微信公眾號(hào):嵌入式與Linux那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    物聯(lián)網(wǎng)的最基本功能是什么?

    萬(wàn)物互聯(lián)大時(shí)代,物聯(lián)網(wǎng)的最基本功能是什么?
    發(fā)表于 06-16 11:33

    BMS的基本功能和硬件拓?fù)?/a>

    BMS基本功能BMS 的硬件拓?fù)銪MS的狀態(tài)估算及均衡控制電池內(nèi)短路的快速識(shí)別
    發(fā)表于 12-16 06:30

    MCU的基本功能及程序編寫

    MCU的基本功能MCU程序的編寫
    發(fā)表于 01-12 07:53

    MCU的基本功能和程序編寫

    MCU的基本功能MCU程序的編寫
    發(fā)表于 01-14 07:42

    MCU的基本功能及程序編寫

    MCU的基本功能MCU程序的編寫
    發(fā)表于 02-02 06:05

    MCU的基本功能

    MCU的基本功能MCU程序的編寫
    發(fā)表于 02-05 06:37

    智能合約的基本功能是什么

    合約的基本功能是通過(guò)價(jià)值交換約定各方責(zé)任。由于DLT(分布式賬簿)技術(shù)的出現(xiàn),智能合約讓合約的編寫和執(zhí)行變得更加高效且自動(dòng)化。然而,如今的智能合約還存在諸多缺陷,因?yàn)樗鼈儫o(wú)法與真實(shí)世界聯(lián)通。預(yù)言機(jī)
    發(fā)表于 07-12 09:00

    晶體管測(cè)量模塊的基本功能有哪些

    晶體管測(cè)量模塊的基本特性有哪些?晶體管測(cè)量模塊的基本功能有哪些?
    發(fā)表于 09-24 07:37

    MCU的基本功能有哪些呢

    以下來(lái)自Atmel Mega128的說(shuō)明手冊(cè):微控制器(微處理器)Microcontroller(MCU)的四個(gè)基本功能為:1.access memory,2.perform calculation
    發(fā)表于 11-03 06:50

    STM32CUBEMX基本功能如何配置?

    STM32CUBEMX基本功能如何配置?
    發(fā)表于 11-23 06:12

    串口的基本配置和基本功能是什么?

    串口功能有哪些?串口的基本配置和基本功能是什么?
    發(fā)表于 12-10 07:19

    reertos基本功能包括什么

    本文介紹嵌入式實(shí)時(shí)操作系統(tǒng)FreeRTO的常用API,freertos基本功能包括 任務(wù)調(diào)度、內(nèi)存管理、中斷管理、定時(shí)器管理、消息隊(duì)列、信號(hào)量、互斥鎖等。1. FreeRTOS 任務(wù)相關(guān)API
    發(fā)表于 12-27 06:36

    介紹一下解決USART通信的最基本功能實(shí)現(xiàn)的編程思路

    作為初學(xué)stm32的小白,下面我來(lái)介紹一下解決USART通信的最基本功能實(shí)現(xiàn)的編程思路。1.
    發(fā)表于 01-20 07:17

    介紹操作系統(tǒng)的基本功能以及UCOSII的移植方法

    文章向大家介紹操作系統(tǒng)的基本功能,以及UCOSII的移植方法。RTOS:Real time Operation SystemKeil RTX 是免版稅的確定性實(shí)時(shí)操作系統(tǒng),適用于 ARM 和 Cortex-M 設(shè)備。RTOS可以
    發(fā)表于 02-18 06:59

    RK3328的軟件調(diào)試操作使用方法是什么

    RK3328的基本功能特點(diǎn)有哪些?如何對(duì)RK3328的多功能硬件進(jìn)行配置?RK3328的軟件調(diào)試操作使用方法是什么?
    發(fā)表于 03-09 06:14
    主站蜘蛛池模板: 桥本有菜护士| 97免费视频在线| 国产精品爽爽久久久久久竹菊| 女厕所边摸边吃奶边做爽视频| 正能量不良WWW免费窗口| 寂寞夜晚免费观看视频| 亚洲、国产综合视频| 国产AV亚洲精品久久久久| 秋霞午夜一级理论片久久| CHESENGAY痞帅警察GV| 奶头好翘是不是想要了 | 中文字幕成人| 久久国产高清视频| 艳鉧动漫片1~6全集在线| 国语自产一区视频| 亚洲精品久久久久AV无码| 国产全肉乱妇杂乱视频| 午夜影院一区二区三区| 国产精品爽黄69天堂A片| 少爷被多个暗卫肉高h| 法国剧丝袜情版h级在线电影| 日日摸天天添天天添无码蜜臀| 成年女人色毛片免费| 日韩伦理电影秋霞影院| 儿子你得太大了慢点插| 日韩欧美一区二区中文字幕| 俄罗斯女人Z0ZOZO| 色偷偷男人的天堂a v| 国产成人精品综合久久久| 舔1V1高H糙汉| 国产偷国产偷亚洲高清app| 亚洲国产精品一区二区三区在线观看| 国产偷国产偷亚洲高清app| 亚洲精品在线免费| 九九热这里有精品| 在线国产视频观看| 美女漏bb| 边做边爱BD免费看片| 四虎精品久久| 国产亚洲人成在线视频| 一道本av免费不卡播放|