首页 > 奇闻 > 正文内容

避免数据竞争!C语言线程安全编程的3个关键技巧

奇闻2025-05-28 06:42:35

锛堢寷鎷嶉敭鐩橈級鍝庡摕鍠傦紒浣犵殑澶氱嚎绋嬬▼搴忔槸涓嶆槸涔熷儚鎶介涓€鏍凤紵鏄庢槑璇ヨ緭鍑?00娆¤鏁帮紝璺戝嚭鏉ュ嵈鏄?7锛熸垨鑰呮洿鍒烘縺鐨勨€斺€旂▼搴忓湪Debug妯″紡姝e父锛屼竴Release灏卞穿婧冿紵鍒€€鐤戯紝杩欏氨鏄暟鎹珵浜夊湪浣滃锛佷粖澶╂暀浣犱笁鎷涗繚鍛芥妧宸э紝涓撴不鍚勭涓嶆湇銆?/p>


涓€銆侌煍?绗竴鎷涳細缁欏叡浜暟鎹笂閿侊紙浣嗗埆涔遍攣锛侊級

鎯宠薄浣犲拰浜斾釜瀹ゅ弸鍏辩敤涓€涓啺绠便€傝鏄皝閮借兘闅忔椂寮€鍐扮闂紝鏈€鍚庤偗瀹氭湁浜哄伔鍚冧綘鐨勫啺娣囨穻銆傗€?strong>鈥嬩簰鏂ラ攣灏辨槸鍐扮涓婄殑瀵嗙爜閿佲€?/strong>鈥嬶紝鍚屼竴鏃堕棿鍙厑璁镐竴涓汉鎿嶄綔銆?/p>

c澶嶅埗
pthread_mutex_t fridge_lock; // 澹版槑閿?/span>

void 鎷垮啺娣囨穻() {
    pthread_mutex_lock(&fridge_lock); // 涓婇攣
    // 鎿嶄綔鍏变韩鍐扮...
    pthread_mutex_unlock(&fridge_lock); // 瑙i攣
}

鈥?strong>鈥嬮€傜敤鍦烘櫙鈥?/strong>鈥嬶細蹇呴』瀹屾暣鎵ц鐨勪唬鐮佸潡锛屾瘮濡傝浆璐︺€佸簱瀛樹慨鏀广€傚幓骞村仛娓告垙鏈嶅姟鍣ㄦ椂锛岀帺瀹惰澶囦氦鏄撳叏闈犺繖涓拺鐫€銆?/p>

鈥?strong>鈥嬭娉暀璁€?/strong>鈥嬶細

  1. 閿佺殑鑼冨洿澶ぇ锛屼細瀵艰嚧鎬ц兘鏆磋穼锛堝儚鎶婃暣涓秴甯傞兘閿佽捣鏉ュ彧璁╀竴涓汉閫涳級
  2. 蹇樿瑙i攣灏辨槸鐏鹃毦锛堝幓骞寸嚎涓婁簨鏁呭鑷?0涓囩敤鎴峰崱姝伙級
  3. 宓屽鍔犻攣鍙兘姝婚攣锛堝缓璁敤pthread_mutex_trylock璁剧疆瓒呮椂锛?/li>

浜屻€佲殹 绗簩鎷涳細鍘熷瓙鎿嶄綔鈥斺€斿揩濡傞棯鐢电殑缁濇潃

濡傛灉鍙槸绠€鍗曠殑鍔犲噺鎿嶄綔锛岀敤鍘熷瓙鍙橀噺姣斾簰鏂ラ攣蹇?0鍊嶏紒灏卞儚瓒呭競鐨勮嚜鍔╃粨璐︽満锛屼笉鐢ㄦ帓闃熺瓑鏀堕摱鍛樸€?/p>

c澶嶅埗
#include 
atomic_int counter = 0; // 鍘熷瓙璁℃暟鍣?/span>

void 鐐瑰嚮缁熻() {
    atomic_fetch_add(&counter, 1); // 鍘熷瓙鑷
}

鈥?strong>鈥嬪疄娴嬪姣斺€?/strong>鈥嬶紙鐧句竾娆$疮鍔狅級锛?/p>

鏂规硶鑰楁椂(ms)鍑嗙‘鎬?/th>
瑁稿1.2闅忔満閿?/td>
浜掓枼閿?/td>48.9100%
鍘熷瓙鎿嶄綔5.7100%

鈥?strong>鈥嬩娇鐢ㄨ瘈绐嶁€?/strong>鈥嬶細

  • 鍙€傜敤浜庡熀鏈暟鎹被鍨嬶紙int/long锛?/li>
  • 娉ㄦ剰鍐呭瓨椤哄簭锛坢emory_order鍙傛暟鍒贡璁撅級
  • 璺ㄥ钩鍙板彲鑳芥湁鍧戯紙ARM鍜寈86鏋舵瀯琛ㄧ幇涓嶅悓锛?/li>

涓夈€侌煋?绗笁鎷涳細鍚勭帺鍚勭殑鈥斺€旂嚎绋嬪眬閮ㄥ瓨鍌?/h3>

鏈変簺鏁版嵁鍘嬫牴涓嶇敤鍏变韩锛佹瘮濡傛瘡涓嚎绋嬬殑涓存椂缂撳瓨锛岀敤__thread鍏抽敭瀛楄姣忎釜绾跨▼閮芥湁鐙珛鍓湰銆?/p>

c澶嶅埗
__thread char local_buffer[1024]; // 姣忎釜绾跨▼鐙湁

void 澶勭悊璇锋眰() {
    sprintf(local_buffer, "绾跨▼%d鐨勬暟鎹?, pthread_self()); 
    // 涓嶇敤閿佷篃涓嶇敤鎷呭績绔炰簤
}

鈥?strong>鈥嬮€傚悎鍦烘櫙鈥?/strong>鈥嬶細

  • 涓存椂鍙橀噺锛堝闅忔満鏁扮瀛愶級
  • 閿欒淇℃伅瀛樺偍
  • 鎬ц兘鏁忔劅鐨勪腑闂磋绠楃粨鏋?/li>

鈥?strong>鈥嬫儕澶╁ぇ鍧戔€?/strong>鈥嬶細

  • 鍒濆鍖栬灏忓績锛堥潤鎬佸垵濮嬪寲 vs 鍔ㄦ€佸垵濮嬪寲锛?/li>
  • 涓嶈兘鐢ㄤ簬绾跨▼闂撮€氫俊
  • 鍐呭瓨鍗犵敤浼氶殢绾跨▼鏁板闀匡紙鏇惧鑷存湇鍔″櫒OOM宕╂簝锛?/li>

馃И 瀹炴垬妗堜緥锛氱綉椤佃闂鏁板櫒

鍋囪瑕佺粺璁?00涓嚎绋嬪悓鏃惰闂〉闈㈢殑娆℃暟锛?/p>

鈥?strong>鈥嬮敊璇啓娉曗€?/strong>鈥嬶細

c澶嶅埗
int count = 0; // 鍏ㄥ眬鍙橀噺

void 璁块棶缃戦〉() {
    count++; // 瑁稿鎿嶄綔
}
// 缁撴灉闅忔満鍦?80~95 涓囦箣闂存尝鍔?/span>

鈥?strong>鈥嬩笁绉嶆敼閫犳柟妗堚€?/strong>鈥嬶細

  1. 鈥?strong>鈥嬪姞閿佹柟妗堚€?/strong>鈥嬶細绋冲畾浣嗘€ц兘鎹熷け30%
  2. 鈥?strong>鈥嬪師瀛愭搷浣溾€?/strong>鈥嬶細鎬ц兘鎹熷け5%锛屼絾涓嶈兘澶勭悊澶嶆潅閫昏緫
  3. 鈥?strong>鈥嬬嚎绋嬫湰鍦拌鏁?瀹氭湡姹囨€烩€?/strong>鈥嬶細鎬ц兘鏈€浼橈紝浣嗗疄鏃舵€х◢宸?/li>

锛堟暡榛戞澘锛夌湅闇€姹傞€夋柟妗堬紒瀹炴椂缁熻鐢ㄥ師瀛愶紝鍏佽寤惰繜鐢ㄦ湰鍦版眹鎬伙紝寮轰竴鑷存€ч渶姹傚彧鑳戒笂閿併€?/p>


馃敟 鐙閬垮潙鎸囧崡

鏍规嵁涓冨勾濉潙缁忛獙锛岄€佷綘涓変釜閿﹀泭锛?/p>

  1. 鈥?strong>鈥嬮攣绮掑害鎺у埗鈥?/strong>鈥嬶細鍍忓悆鍥炶浆瀵垮徃锛屽彧鎷胯嚜宸辫鐨勭洏瀛愶紙涓寸晫鍖哄敖閲忓皬锛?/li>
  2. 鈥?strong>鈥嬮槻寰℃€х紪绋嬧€?/strong>鈥嬶細鎵€鏈夊叡浜彉閲忛粯璁ゆ湁姣掞紝蹇呴』鎯虫竻妤氬悓姝ユ柟妗?/li>
  3. 鈥?strong>鈥嬪帇鍔涙祴璇曗€?/strong>鈥嬶細鐢?code>jmeter鎴栬嚜瀹氫箟鑴氭湰妯℃嫙200%鐨勫苟鍙戦噺

锛堢獊鐒舵媿澶ц吙锛夊幓骞存湁涓湇鍔$敤鍘熷瓙鍙橀噺鐪佷簡90%鎬ц兘锛岀粨鏋滃洜涓哄繕璁板鐞咥BA闂锛堝€艰鏀规潵鏀瑰幓鍙堝洖鍒板師鍊硷級锛屽鑷磋祫閲戦噸澶嶇粨绠?..鎵€浠ュ晩锛屾病鏈夐摱寮癸紒


璇寸偣寰楃姜浜虹殑璇?/h3>

寰堝鏁欑▼鏁欎汉鏃犺剳鍔犻攣锛岀畝鐩村氨鏄浜哄瓙寮燂紒鎴戞湁涓変釜鍘熷垯锛?/p>

  1. 鑳戒笉鐢ㄥ叡浜彉閲忓氨涓嶇敤锛堜紶鍊间紭浜庝紶鎸囬拡锛?/li>
  2. 鑳界敤鍘熷瓙鍙橀噺灏变笉鐢ㄩ攣锛堜絾瑕佺煡閬撳眬闄愭€э級
  3. 蹇呴』鍏变韩鏃讹紝灏佽鎴愮嚎绋嬪畨鍏ㄦ帴鍙o紙鍍廜S鎻愪緵鐨凙PI锛?/li>

鏈€鍚庨€佷釜褰╄泲锛氱敤valgrind --tool=helgrind妫€娴嬫暟鎹珵浜夛紝姣斾汉鐪兼壘bug楂樻晥100鍊嶏紒浣嗗皬蹇冿紝杩欏伐鍏峰彲鑳借浣犵殑绋嬪簭璺戝緱姣旇湕鐗涜繕鎱紙绗戯級銆?/p>

搜索