日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

数据竞争(data race)问题分析的利器——valgrind的Helgrind

發(fā)布時(shí)間:2023/11/27 生活经验 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据竞争(data race)问题分析的利器——valgrind的Helgrind 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? ? 數(shù)據(jù)競(jìng)爭(zhēng)(data race)是指在非線程安全的情況下,多線程對(duì)同一個(gè)地址空間進(jìn)行寫(xiě)操作。一般來(lái)說(shuō),我們都會(huì)通過(guò)線程同步方法來(lái)保證數(shù)據(jù)的安全,比如采用互斥量或者讀寫(xiě)鎖。但是由于某些筆誤或者設(shè)計(jì)的缺陷,還是存在data race的可能性的。(轉(zhuǎn)載請(qǐng)指明出于breaksoftware的csdn博客)

? ? ? ? 比如下面這段代碼

#define _GNU_SOURCE 1#include <pthread.h>
#include <stdio.h>
#include <unistd.h>static pthread_rwlock_t s_rwlock;
static int s_racy;static void sleep_ms(const int ms) {struct timespec delay = { ms / 1000, (ms % 1000) * 1000 * 1000 };nanosleep(&delay, 0);
}static void* thread_func(void* arg) {pthread_rwlock_rdlock(&s_rwlock);s_racy++;pthread_rwlock_unlock(&s_rwlock);sleep_ms(100);return 0;
}int main(int argc, char** argv) {pthread_t thread1;pthread_t thread2;pthread_rwlock_init(&s_rwlock, 0);pthread_create(&thread1, 0, thread_func, 0);pthread_create(&thread2, 0, thread_func, 0);pthread_join(thread1, 0);pthread_join(thread2, 0);pthread_rwlock_destroy(&s_rwlock);fprintf(stderr, "Result: %d\n", s_racy);return 0;
}

? ? ? ? 線程函數(shù)thread_fun主要工作就是對(duì)全局變量s_racy進(jìn)行自增。由于自增是寫(xiě)操作,所以需要加鎖。但是第16行加的是讀鎖——共享鎖,這就意味著其他線程也會(huì)獲得該讀鎖。這個(gè)錯(cuò)誤就將導(dǎo)致兩個(gè)線程同時(shí)無(wú)協(xié)調(diào)的修改s_racy變量。

? ? ? ? 對(duì)這個(gè)問(wèn)題,我們可以使用如下指令分析

valgrind --tool=helgrind ./rdlock_race 

? ? ? ? 最后我們會(huì)得到如下的結(jié)果顯示

==5457== Possible data race during write of size 4 at 0x309078 by thread #3
==5457== Locks held: none
==5457==    at 0x108A19: thread_func (rwlock_race.c:25)
==5457==    by 0x4C36C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so)
==5457==    by 0x4E496DA: start_thread (pthread_create.c:463)
==5457==    by 0x518288E: clone (clone.S:95)
==5457== 
==5457== This conflicts with a previous write of size 4 by thread #2
==5457== Locks held: none
==5457==    at 0x108A19: thread_func (rwlock_race.c:25)
==5457==    by 0x4C36C26: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so)
==5457==    by 0x4E496DA: start_thread (pthread_create.c:463)
==5457==    by 0x518288E: clone (clone.S:95)
==5457==  Address 0x309078 is 0 bytes inside data symbol "s_racy"
==5457== 

? ? ? ? 第1行顯示線程3訪問(wèn)的0x309078地址有4個(gè)字節(jié)空間可能存在數(shù)據(jù)競(jìng)爭(zhēng)。

? ? ? ? 第2行顯示線程3操作這個(gè)空間時(shí)沒(méi)有持有獨(dú)占鎖。其具體操作的調(diào)用堆棧在第3到第6行體現(xiàn)。

? ? ? ? 第8行顯示線程2也操作了這個(gè)空間。

? ? ? ? 第9行顯示線程2操作這個(gè)空間是也沒(méi)有持有獨(dú)占鎖。

? ? ? ? 第14行則直接指出被操作的空間的變量名稱為s_racy。

? ? ? ? 如此我們便找到存在數(shù)據(jù)競(jìng)爭(zhēng)的變量了。

? ? ? ? 我們將讀鎖改成寫(xiě)鎖——即將pthread_rwlock_rdlock改成pthread_rwlock_wrlock,就不會(huì)出現(xiàn)上述分析結(jié)果了。

總結(jié)

以上是生活随笔為你收集整理的数据竞争(data race)问题分析的利器——valgrind的Helgrind的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。