首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 多線程複雜計算的暫停與恢復實現方案

     編輯:程式設計疑難解答

核心思路

採用 共享旗標 + 條件變量 模式,避免直接操作執行緒(如 SuspendThread)導致死鎖或資源洩漏。

關鍵數據結構

struct TaskContext {
    std::mutex mtx;
    std::condition_variable cv;
    bool paused = false;
    bool cancelled = false;
    // 計算所需的中間狀態(數組指針、進度索引等)
    int* array;
    size_t progress;
};

工作執行緒邏輯

void worker(TaskContext& ctx) {
    for (size_t i = ctx.progress; i < N; ++i) {
        std::unique_lock<std::mutex> lk(ctx.mtx);
        ctx.cv.wait(lk, [&]{ return !ctx.paused || ctx.cancelled; });
        if (ctx.cancelled) break;
        // 執行單步計算
        heavy_computation(ctx.array[i]);
        ctx.progress = i + 1;  // 關鍵:持久化進度
    }
}

控制介面

void pause(TaskContext& ctx) {
    std::lock_guard<std::mutex> lk(ctx.mtx);
    ctx.paused = true;
}

void resume(TaskContext& ctx) {
    std::lock_guard<std::mutex> lk(ctx.mtx);
    ctx.paused = false;
    ctx.cv.notify_one();
}

void cancel(TaskContext& ctx) {
    std::lock_guard<std::mutex> lk(ctx.mtx);
    ctx.cancelled = true;
    ctx.cv.notify_all();
}

持久化與恢復

  • 定期將 TaskContext 序列化至檔案(JSON/Protobuf),包含 progress、array 等關鍵狀態。
  • 啟動時反序列化,將 progress 傳入新建立的 TaskContext,工作執行緒自動從中斷點繼續。
  • 避免直接序列化 std::mutex/condition_variable,僅存儲業務狀態。

替代方案對比

方案優點缺點
旗標+條件變量安全、可移植、精確控制需修改計算迴圈插入檢查點
寫檔案检查點無需改動演算法邏輯I/O 開銷大、恢復慢
SuspendThread/ResumeThread無侵入式極易死鎖、不安全、Windows 專用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved