主線程執行快速排序,四個子線程分別執行冒泡、選擇、堆、插入排序。所有線程共享控制台輸出,需互斥訪問 PrintResult 函數,否則輸出交織混亂。
__stdcall、返回 unsigned long、單一 32 位參數static,傳遞 this 指針| 機制 | 創建/初始化 | 進入 | 離開 | 適用場景 |
|---|---|---|---|---|
| Event | CreateEvent(NULL, FALSE, TRUE, "PrintResult") | WaitForSingleObject(evt, INFINITE) | SetEvent(evt) | 簡單同步、自動重置 |
| CriticalSection | InitializeCriticalSection(&cs) | EnterCriticalSection(&cs) | LeaveCriticalSection(&cs) | 進程內高性能、無內核切換 |
| Mutex | CreateMutex(NULL, FALSE, "PrintMutex") | WaitForSingleObject(mtx, INFINITE) | ReleaseMutex(mtx) | 跨進程同步、可檢測放棄 |
HANDLE evtTerminate = CreateEvent(NULL, FALSE, FALSE, "Terminate");
HANDLE evtPrint = CreateEvent(NULL, FALSE, TRUE, "PrintResult");
// CRITICAL_SECTION csPrint; InitializeCriticalSection(&csPrint);
// HANDLE mtxPrint = CreateMutex(NULL, FALSE, "PrintMutex");
struct MySafeArray { long* data; int iLength; };
void PrintResult(long* arr, int len, const char* tag) {
WaitForSingleObject(evtPrint, INFINITE);
// EnterCriticalSection(&csPrint);
// WaitForSingleObject(mtxPrint, INFINITE);
printf("%s: ", tag);
for (int i=0; i
四大排序算法實現要點
- 冒泡:雙重循環相鄰交換,最大元素逐輪沉底
- 選擇:每輪從無序區選最小,插入有序區尾部
- 堆排序:構建最小堆,反復取根並重建堆
- 插入:將無序元素逐個插入有序區適當位置
- 快速排序(主線程):分治法,選基準雙向掃描分區,遞歸處理
線程完成同步
InterlockedIncrement(&ThreadCompleted);
if (ThreadCompleted == 4) SetEvent(evtTerminate);
主線程 WaitForSingleObject(evtTerminate, INFINITE) 等待所有子線程結束。
運行效果
啟用互斥時,四種排序結果依序完整輸出;註釋互斥代碼則輸出交織。Sleep(100) 放大競爭現象以便觀察。