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

C++ Windows 線程函數必須回傳值:DWORD WINAPI 簽名解析

     編輯:程式設計疑難解答

錯誤原因

DWORD WINAPI Fun1(LPVOID) 宣告回傳 DWORD,但函數本體缺少 return 語句,導致編譯錯誤 C4716: 'Fun1': must return a value。

正確寫法

DWORD WINAPI Fun1(LPVOID lpParameter)
{
    char* buf = static_cast<char*>(lpParameter);
    std::cout << reinterpret_cast<uintptr_t>(buf) << std::endl;
    Sleep(1000);
    return 0; // 必須回傳 DWORD
}

主程式修正重點

  1. 線程參數傳遞:(LPVOID)i 將整數強轉指標,線程內再轉回 intptr_t 取值,避免 64 位元截斷
  2. 結束方式:勿用 TerminateProcess (會殺掉整個進程),改用 WaitForSingleObject + CloseHandle
  3. 線程句柄管理:建立後必須 CloseHandle,否則洩漏核心物件
int main()
{
    HANDLE hThread[2];
    for (int i = 0; i < 2; ++i) {
        hThread[i] = CreateThread(nullptr, 0, Fun1, 
            reinterpret_cast<LPVOID>(static_cast<intptr_t>(i)), 0, nullptr);
    }
    std::cout << "3" << std::endl;

    WaitForMultipleObjects(2, hThread, TRUE, INFINITE); // 等待所有線程結束
    for (int i = 0; i < 2; ++i) CloseHandle(hThread[i]);
    return 0;
}

現代 C++ 建議

優先使用 std::thread + std::jthread (C++20) 或 std::async,配合 RAII 管理生命週期,避免原生 API 易錯誤。

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