| 屬性 | 設置函數 | 說明 |
| 分離態 | pthread_attr_setdetachstate | PTHREAD_CREATE_DETACHED (不可join, 自動回收) / PTHREAD_CREATE_JOINABLE (默認, 需join) |
| 棧大小 | pthread_attr_setstacksize | 最小 PTHREAD_STACK_MIN (通常 16KB/64KB),默認 8MB (Linux) |
| 棧地址 | pthread_attr_setstack | 指定棧內存區域 (高級用法) |
| 調度策略/優先級 | pthread_attr_setschedpolicy/priority | 實時調度 SCHED_FIFO/RR 需特權 |
| 繼承調度 | pthread_attr_setinheritsched | 繼承創建者屬性 vs 顯式設置 |
四、編譯與鏈接
# 必須鏈接 pthread 庫
gcc -pthread -o prog thread_prog.c
# 或顯式
gcc -o prog thread_prog.c -lpthread
-pthread 同時處理編譯預定義宏和鏈接,**推薦使用**。
- 頭文件路徑:
/usr/include/pthread.h (glibc)。
五、典型調用流程
// 全局數據 (需同步保護)
int shared_data = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *worker(void *arg) {
int id = *(int*)arg;
for (int i=0; i<1000; i++) {
pthread_mutex_lock(&mutex);
shared_data++;
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL); // 或 return NULL;
}
int main() {
pthread_t t1, t2;
int id1 = 1, id2 = 2;
pthread_create(&t1, NULL, worker, &id1);
pthread_create(&t2, NULL, worker, &id2);
// 主線程做其他事...
pthread_join(t1, NULL);
pthread_join(t2, NULL);
printf("Final: %d\n", shared_data); // 2000
return 0;
}
六、常見錯誤
- 忘記
-pthread → 鏈接錯誤 undefined reference to pthread_create。
- 入口函數簽名錯誤:必須
void* (*)(void*),不能有其他參數/返回類型。
- 傳遞棧上局部變量地址給線程,主線程提前銷毀 → 線程讀到垃圾值。
- 未
join 也未 detach → 線程結束後資源洩漏 (僵屍線程)。
- 主線程
return 0 導致進程退出,子線程被強制殺死未完成工作。
pthread_join 同一線程兩次 / join 已分離線程 → EINVAL。
- 線程間共享數據無同步 (互斥量/原子操作) → 數據競態,未定義行為。
七、分離態線程
pthread_detach(tid) 或屬性設置 PTHREAD_CREATE_DETACHED。
- 線程結束時**自動回收資源**,無需/不可
join。
- 適用於「發射後不管」的後台任務 (日誌、監控、定時清理)。
- 無法獲取退出值。
掌握 create/exit/join 鐵三角與屬性對象,是 POSIX 多線程編程的入門鑰匙。記住:創建傳參、退出傳值、加入回收、分離自回收、共享必同步。
- 上一篇文章: C語言實現面向對象編程:結構體+函數指針封裝鏈表ADT完整實戰
- 下一篇文章: printf 深度解析:轉換說明匹配、參數棧傳遞機制、返回值與類型不匹配陷阱
Copyright ©
程式碼之家 All Rights Reserved