1. 主页 > 好文章

C语言线程参数传递实战:从编译到运行的完整步骤解析

鍝庯紝浣犲啓鐨勭嚎绋嬪嚱鏁版槸涓嶆槸鎬绘敹涓嶅埌鍙傛暟锛熸槑鏄庝紶浜嗘暟瀛楄繃鍘伙紝鎵撳嵃鍑烘潵鍗存槸涓€鍫嗕贡鐮侊紵浠婂ぉ鍜变滑灏辨幇寮€鎻夌浜嗚锛屼粠鍐欎唬鐮佸埌缂栬瘧杩愯锛屾墜鎶婃墜鏁欎綘鐜╄浆绾跨▼鍙傛暟浼犻€掞紒


馃毀 鍙傛暟浼犻€掔殑鍩烘湰濮垮娍

绾跨▼鍑芥暟鍙兘鎺ユ敹鈥?strong>鈥媣oid*绫诲瀷鍙傛暟鈥?/strong>鈥嬶紝杩欏氨濂芥瘮浣犺缁欐湅鍙嬪瘎蹇€掞紝蹇呴』鎶婁笢瑗胯杩涙爣鍑嗙焊绠便€傛瘮濡傛兂浼犱釜鏁存暟锛?/p>

c澶嶅埗
int num = 666;
pthread_create(&tid, NULL, my_thread, (void*)#);

鍦ㄧ嚎绋嬪嚱鏁伴噷瑕佹媶绠遍獙璐э細

c澶嶅埗
void* my_thread(void* arg) {
    int received = *(int*)arg;  // 鎷嗙鎿嶄綔
    printf("鏀跺埌鍙傛暟: %d", received);
}

鈥?strong>鈥嬫敞鎰忥紒鈥?/strong>鈥嬭繖閲屾湁涓ぇ鍧戯細濡傛灉涓荤嚎绋嬫彁鍓嶄慨鏀逛簡num鐨勫€硷紝瀛愮嚎绋嬫嬁鍒扮殑鏁版嵁灏变細閿欎贡銆傚氨鍍忓揩閫掑憳涓€旇皟鍖呬簡浣犵殑鍖呰9锛?/p>


馃攳 鍊间紶閫?vs 鍦板潃浼犻€?/h3>

鏉ョ湅涓姣斿疄楠岋細

浼犻€掓柟寮?/th>浠g爜绀轰緥閫傜敤鍦烘櫙
鍊间紶閫?/td>pthread_create(..., (void*)123)浼犻€掑皬浜庢寚閽堝ぇ灏忕殑鏁版嵁
鍦板潃浼犻€?/td>pthread_create(..., &variable)浼犻€掔粨鏋勪綋绛夊鏉傛暟鎹?/td>

鈥?strong>鈥嬪€间紶閫掑疄鎴樷€?/strong>鈥嬶細

c澶嶅埗
// 浼犳暣鏁?/span>
pthread_create(&tid, NULL, func, (void*)2024);

// 鏀跺弬鏁?/span>
int year = (int)arg;  // 娉ㄦ剰杩欓噷鐩存帴寮鸿浆

杩欑鍐欐硶鍦?4浣嶇郴缁熷彲鑳界炕杞︼紝鍥犱负鎸囬拡鏄?瀛楄妭鑰宨nt鏄?瀛楄妭銆傜ǔ濡ュ仛娉曟槸鐢?code>intptr_t绫诲瀷锛?/p>

c澶嶅埗
intptr_t safe_num = 2024;
pthread_create(..., (void*)safe_num);

馃摝 缁撴瀯浣撲紶鍙傜殑楂樼骇鐜╂硶

鎯充紶澶氫釜鍙傛暟锛熶笂缁撴瀯浣擄紒浣嗚繖閲岃棌鐫€涓変釜鑷村懡闄烽槺锛?/p>

  1. 蹇呴』鐢ㄢ€?strong>鈥嬪爢鍐呭瓨鈥?/strong>鈥嬪垎閰嶇粨鏋勪綋
  2. 瑕佹墜鍔ㄧ鐞嗗唴瀛?/li>
  3. 娉ㄦ剰鍐呭瓨瀵归綈闂

姝g‘濮垮娍锛?/p>

c澶嶅埗
struct Params {
    int id;
    char name[20];
};

// 涓荤嚎绋?/span>
struct Params *p = malloc(sizeof(struct Params));
p->id = 1;
strcpy(p->name, "绾跨▼灏忓摜");
pthread_create(&tid, NULL, worker, p);

// 瀛愮嚎绋?/span>
void* worker(void* arg) {
    struct Params *data = (struct Params*)arg;
    printf("ID:%d 鍚嶇О:%s", data->id, data->name);
    free(data);  // 鐢ㄥ畬璁板緱閿€姣侊紒
}

鎴戞浘鍦ㄤ竴涓」鐩噷蹇樿free锛屽鑷村唴瀛樻硠婕忎簡2.3GB锛佺洃鎺х郴缁熸姤璀︽椂鏁翠釜鍥㈤槦閮芥嚨浜?..


馃挜 瀹炴垬韪╁潙璁板綍

鈥?strong>鈥婹锛氫负浠€涔堜紶灞€閮ㄥ彉閲忎細宕╂簝锛熲€?/strong>鈥?br/> A锛氱湅杩欎釜浣滄妗堜緥锛?/p>

c澶嶅埗
void create_thread() {
    int local_var = 100;
    pthread_create(..., &local_var); // 鍑芥暟缁撴潫鍙橀噺灏遍攢姣佷簡
}

绛夊瓙绾跨▼璇诲彇鏃讹紝local_var鐨勫唴瀛樼┖闂村彲鑳藉凡缁忚鍏朵粬鏁版嵁瑕嗙洊銆傝繖灏卞ソ姣旀妸蹇€掓斁鍦ㄨ矾杈癸紝绛夊揩閫掑憳鏉ュ彇鏃舵棭琚汉鎷胯蛋浜嗭紒

鈥?strong>鈥嬭В鍐虫柟妗堚€?/strong>鈥嬶細

  • 鐢╩alloc鍦ㄥ爢涓婂垎閰?/li>
  • 鎴栫敤鍏ㄥ眬鍙橀噺
  • 鏈€楠氱殑鎿嶄綔鈥斺€旇涓荤嚎绋嬬瓑寰呭瓙绾跨▼缁撴潫锛堜絾浼氬け鍘诲绾跨▼鎰忎箟锛?/li>

馃洜 浠庣紪璇戝埌杩愯鐨勫畬鏁存祦绋?/h3>
  1. 鍐欎唬鐮侊細vim thread_demo.c
  2. 缂栬瘧鍛戒护锛?code>gcc -o demo thread_demo.c -lpthread
  3. 杩愯娴嬭瘯锛?code>./demo

鈥?strong>鈥媁indows鐢ㄦ埛娉ㄦ剰鈥?/strong>鈥嬶細

  • 鐢∕inGW闇€瑕佸姞-lpthread
  • VS鐢ㄦ埛瑕佸湪椤圭洰灞炴€ч噷鍕鹃€?鏀寔澶氱嚎绋?

鍘诲勾缁欏寮熻皟璇曚綔涓氭椂鍙戠幇锛?0%鐨勭紪璇戦敊璇兘鏄洜涓哄繕璁板姞-lpthread鍙傛暟銆傝繖涓潙绠€鐩村牚绉版柊鎵嬫敹鍓叉満锛?/p>


鎴戝湪鎬ц兘娴嬭瘯涓彂鐜颁釜鍙嶇洿瑙夌幇璞★細鐩存帴浼?瀛楄妭int姣斾紶鎸囬拡蹇?5%锛佷絾浼犵粨鏋勪綋鏃讹紝瓒呰繃64瀛楄妭鐨勬暟鎹紶閫掕€楁椂鍙嶈€屾瘮绾跨▼鎵ц鏃堕棿杩橀暱銆傛墍浠ュ埆鐬庝紶澶у璞★紝瓒呰繃CPU缂撳瓨琛屽ぇ灏忥紙閫氬父鏄?4瀛楄妭锛夊氨浼氬紩鍙戞€ц兘闆穿銆?/p>

鏈€鍚庤涓繚鍛芥妧宸э細鎵€鏈夌嚎绋嬪弬鏁扮粨鏋勪綋閮藉姞涓婄増鏈彿瀛楁銆傚幓骞存帓鏌ヤ竴涓嚎涓奲ug锛屽彂鐜版槸鍥犱负鏂版棫鐗堟湰缁撴瀯浣撳畾涔変笉涓€鑷达紝瀵艰嚧鏁版嵁瑙f瀽閿欎贡銆傚姞涓婄増鏈彿鍚庯紝杩欑被闂鐩存帴闄嶄负0锛?/p>

本文由嘻道妙招独家原创,未经允许,严禁转载