vc++socket笔记2-2

退出线程的方式

示例1:线程中用ExitThread();函数中的参数为返回值。

#include<Windows.h>
#include<strsafe.h>// 缓冲区处理
#define BUF_SIZE 255

DWORD WINAPI ThreadProc(LPVOID lpParam)// LPVOID 是 void* 的意思
{
    HANDLE hStdout;
    TCHAR msgBuf[BUF_SIZE];    // TCHAR 是 WCHAR 的别名,是宽字符的意思,也就是两字节的字符类型,类似汉字
    size_t cchStringSize;
    DWORD dwChars;
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);    //得到标准输出设备的句柄,用于打印
    if (hStdout == INVALID_HANDLE_VALUE)return 1;
    // 双引号前加L表示是宽字符
    StringCchPrintf(msgBuf, BUF_SIZE, L"线程ID=%d\n",GetCurrentThreadId());// 代替sprintf
    StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);    // 代替strlen
    WriteConsole(hStdout, msgBuf, cchStringSize, &dwChars, NULL);// 代替printf
    //HeapFree(GetProcessHeap(), 0, pData);// 释放内存
    WriteConsole(hStdout, L"线程即将结束\n", 7, &dwChars, NULL);
    ExitThread(5);
    WriteConsole(hStdout, L"这句话不会打印", 7, &dwChars, NULL);
    return 0;
}
int main(int argc, TCHAR* argv[])
{
    HANDLE h;
    DWORD dwCode, dwID;
    h = CreateThread(NULL, 0, ThreadProc, NULL, 0, &dwID);
    Sleep(1500);
    GetExitCodeThread(h, &dwCode);
    printf("ID为%d的线程退出码:%d\n", dwID, dwCode);
    CloseHandle(h);
    return 0;
}

 

示例2:TerminateThread,据说用这个会导致死锁,但是我运行起来没问题啊?有大佬知道什么原因吗?

#include<Windows.h>
#include<strsafe.h>// 缓冲区处理

DWORD WINAPI ThreadProc(LPVOID lpParam)// LPVOID 是 void* 的意思
{
    char* p;
    while (1)
    {
        p = new char[5];
        delete[]p;
    }
    return 0;
}
int main(int argc, TCHAR* argv[])
{
    HANDLE h;
    char* q;
    h = CreateThread(NULL, 0, ThreadProc, NULL, 0,NULL);
    Sleep(1500);
    TerminateThread(h, 0);
    q = new char[2];
    printf("分配成功\n");
    delete[]q;
    CloseHandle(h);
    return 0;
}

 

示例3:WaitForSingleObject(HANDLE,DWORD);

#include<Windows.h>
BOOL gbExit = TRUE;
DWORD WINAPI ThreadProc(LPVOID lpParam)// LPVOID 是 void* 的意思
{
    char* p;
    while (gbExit)
    {
        p = new char[5];
        delete[]p;
    }
    return 0;
}
int main(int argc, TCHAR* argv[])
{
    HANDLE h;
    char* q;
    h = CreateThread(NULL, 0, ThreadProc, NULL, 0,NULL);
    Sleep(1500);
    gbExit = false;
    WaitForSingleObject(h, INFINITE);// INFINITE表示永久等待,线程不停进程不止
    h = NULL;
    q = new char[2];
    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), L"分配成功", 5, NULL, NULL);
    delete[]q;
    CloseHandle(h);
    return 0;
}

 

posted @ 2022-03-12 17:11  才出昆仑便不清  阅读(26)  评论(0)    收藏  举报