首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

多線程排序演示:臨界區互斥控制的三種實現方式

     編輯:關於VC++

背景

主線程執行快速排序,四個子線程分別執行冒泡、選擇、堆、插入排序。所有線程共享控制台輸出,需互斥訪問 PrintResult 函數,否則輸出交織混亂。

線程創建與同步對象

CreateThread 關鍵參數

  • 線程函數:__stdcall、返回 unsigned long、單一 32 位參數
  • 類成員函數需 static,傳遞 this 指針

三種互斥機制對比

機制創建/初始化進入離開適用場景
EventCreateEvent(NULL, FALSE, TRUE, "PrintResult")WaitForSingleObject(evt, INFINITE)SetEvent(evt)簡單同步、自動重置
CriticalSectionInitializeCriticalSection(&cs)EnterCriticalSection(&cs)LeaveCriticalSection(&cs)進程內高性能、無內核切換
MutexCreateMutex(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) 放大競爭現象以便觀察。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved