本示例演示如何使用 POSIX 線程庫(pthread)構建一個多線程協作程序:多個計算線程並行生成數列項(1/i),兩個消費線程分別採用超時等待與無限等待兩種策略消費數據,完成不同的累加運算。程序輸出詳細記錄了線程間的同步交互過程,是學習條件變量、互斥鎖、線程同步的優秀實戰教材。
myjg[]:雙重用途數組。myjg[0] 存儲「已計算到的索引 i」,myjg[1..max] 存儲對應的 1/i 值。isend:標誌位,指示計算是否結束。eventlock (pthread_mutex_t):保護共享數據的互斥鎖。myevent (pthread_cond_t):條件變量,用於線程間發送「新數據就緒」信號。mycomp)線程池中每個線程循環執行:
isend 若結束則退出。myjg[0] 取得當前索引 i,若 i < max 則遞增並寫回。1.0/i 存入 myjg[i],打印進度。max,設置 isend=1,發送 pthread_cond_signal 通知一個等待線程,隨後 sleep(2) 後退出。MAXTDS(線程池大小)個數,發送 pthread_cond_broadcast 喚醒所有消費線程,並 sleep(3) 模擬間歇。myprint1)採用 pthread_cond_timedwait,設置 1 秒超時:
ETIMEDOUT 時打印 "time out",繼續下一輪等待,不阻塞。rc==0) 時,讀取 myjg[0] 獲取最新索引 maxi,累加 curj..maxi 區間的值,打印累加過程與結果。curj > max,輸出最終累加和。myprint2)採用 pthread_cond_wait 永久阻塞等待信號:
maxi,但在區間內執行 jg += fh * myjg[curi],fh 在 1/-1 間翻轉,實現交替加減(1/1 - 1/2 + 1/3 - ...)。curi > max。max(≤1000)。MAXTDS=5),每創建一個 sleep(1) 錯開啟動。sleep 等待足夠時間,最後銷毀鎖退出。終端輸出清晰展示了:
wait 原子性地釋放鎖並阻塞,被喚醒後重新獲取鎖。signal 喚醒一個線程(適合單消費者),broadcast 喚醒所有(適合多消費者或狀態變更)。timedwait 允許線程定期檢查其他條件,增強健壯性。myjg[0] 充當「生產進度游標」,消費者據此決定處理範圍,無需額外隊列結構。此程序雖為教學演示,但完整呈現了生產者-消費者模型的核心同步邏輯,是掌握 C 多線程編程的寶貴案例。