將 Windows 多線程程式碼移植到 Linux 絕非簡單的 API 對應替換。本文系統梳理 Win32 與 POSIX/System V 同步原語的對應關係,助你避開移植陷阱。
| Windows API | Linux POSIX | Linux System V | 適用場景 |
|---|---|---|---|
| 信號量 | sem_init() / sem_wait() / sem_post() | semget() / semop() / semctl() | 資源計數、生產者-消費者 |
| 互斥鎖 | pthread_mutex_init() / pthread_mutex_lock() | — | 臨界區保護 |
| 事件 | pthread_cond_init() / pthread_cond_wait() | — | 線程等待/通知 |
| 關鍵區 | pthread_mutex_t (快速鎖) | — | 進程內高效互斥 |
CreateSemaphore()HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG lInitialCount, // 初始計數
LONG lMaximumCount, // 最大計數
LPCTSTR lpName // NULL=無名(進程內), 有名=跨進程
);
int sem_init(sem_t *sem, int pshared, unsigned int value);
// pshared=0: 線程間共享; pshared≠0: 進程間共享(需共享記憶體)
// 最大值受 SEM_VALUE_MAX 限制
int semget(key_t key, int nsems, int semflg);
// key: ftok() 生成或 IPC_PRIVATE
// nsems: 信號量集合中的信號量數量
// semflg: IPC_CREAT | IPC_EXCL | 權限位
WaitForSingleObject(hSem, dwMilliseconds) 內建超時sem_wait() 無超時,需用 sem_trywait() + 輪詢或 sem_timedwait() (POSIX.1-2001)semop() 配合 IPC_NOWAIT 標誌實現非阻塞,超時需自行實現ReleaseSemaphore(hSem, lReleaseCount, lpPreviousCount) 可一次釋放多個計數sem_post() 每次只增 1,需循環呼叫semop() 設 sem_op = 1 (或更大值)CloseHandle() 關閉句柄,系統自動回收sem_destroy() 銷毀信號量物件semctl(semid, 0, IPC_RMID) 刪除整個信號量集,**需創建者或 root 權限**Semaphore、Mutex、Event,內部條件編譯實作key_t,跨進程同步需統一命名策略errno,Windows 返回 NULL/FALSE 並用 GetLastError()理解這些本質差異,配合良好的抽象封裝,跨平台多線程移植將不再是噩夢。