【Win32多线程】如何初始化一个新线程,停止一个执行中的线程,调整线程优先权?

Win32 SDK/MFC编程 专栏收录该内容
16 篇文章 0 订阅
如何在某个线程内终止另一个正在运行的线程?

--------干净地终止一个线程
利用TerminateThread()安全的关闭执行中的一个线程
BOOL TerminateThread(
  HANDLE hThread,    // handle to thread
  DWORD dwExitCode   // exit code线程的结束代码
);

该函数会引来许多问题,如果内存泄露。尽量不使用TerminateThread()
下面利用event对象来干净的结束一个线程
/*
 * 
 * Demonstrates how to request threads to exit.
 * 结束线程
 * 
 */


#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>




DWORD WINAPI ThreadFunc(LPVOID);


HANDLE hRequestExitEvent = FALSE;


int main()
{
    HANDLE hThreads[2];
    DWORD dwThreadId;
    DWORD dwExitCode = 0;
    int i;


    hRequestExitEvent = CreateEvent(
        NULL, TRUE, FALSE, NULL);
	//创建event对象,一开始处于未激发状态,靠程序来设置激发


    for (i=0; i<2; i++)
       hThreads[i] = CreateThread(NULL,
            0,
            ThreadFunc,
            (LPVOID)i,
            0,
            &dwThreadId);
       


    // Wait around for awhile, make
    // sure the thread is running.
    Sleep(1000);//保证线程可以运行


    SetEvent(hRequestExitEvent);//设置event激发状态通知线程退出
    WaitForMultipleObjects(2, hThreads, TRUE, INFINITE);//主线程退出之前,确保其他线程已经安全退出


    for (i=0; i<2; i++)
        CloseHandle(hThreads[i]);


    return EXIT_SUCCESS;
}


DWORD WINAPI ThreadFunc(LPVOID p)
{
    int i;
    int inside = 0;


    UNREFERENCED_PARAMETER(p);


    /* Seed the random-number generator */
    srand( (unsigned)time( NULL ) );


    for (i=0; i<1000000; i++)
    {
        double x = (double)(rand())/RAND_MAX;
        double y = (double)(rand())/RAND_MAX;
        if ( (x*x + y*y) <= 1.0 )
            inside++;
        if (WaitForSingleObject(hRequestExitEvent, 0) != WAIT_TIMEOUT) //等待event对象的激发状态
        {
            printf("Received request to terminate\n");  //当收到event激发,则退出
            return (DWORD)-1;
        }
    }
    printf("PI = %.4g\n", (double)inside / i * 4);
    return 0;
}

-----线程优先权(Thread Priority)

优先权类别:它是进程的属性之一。这个属性可以表现出这一个进程和其他进程比较之下的重要性。Win32提供4种优先权类别。每一个类别对应一个基本的优先权层级。
优先权类别                                  基础优先权值
HIGH_PRIORITY_CLASS                            13
IDLE_PRIORITY_CLASS                             4
NORMAL_PRIORITY_CLASS                           7or8(大部分程序使用的)
REALTIME_PRIORITY_CLASS                          24
优先权类别适用于进程而非线程。可以利用SetPriortiyClass()和GetPriorityClass()来调整和验证其值。


优先权层级:线程的优先权层级是对进程的优先权类别的一个修改,使得你能够调整同一个进程内的各个线程的相对重要性。一共有七种优先权层级。

优先级层级                                                         调整值
 HTREAD_PRIORITY_HIGHEST                      +2
HTREAD_PRIORITY_ABOVE_NORMAL          +1
HTREAD_PRIORITY_NORMAL                        0
HTREAD_PRIORITY_BELOW_NORMAL          -1
HTREAD_PRIORITY_LOWEST                        -2
HTREAD_PRIORITY_IDLE                                 set to 1
HTREAD_PRIORITY_TIME_CRITICAL                set to 15


优先权层级利用SetThreadPriority()改变。
BOOL SetThreadPriority(
  HANDLE hThread, // handle to the thread
  int nPriority   // thread priority level
);

获取目前线程的优先权GetThreadPriority()
int GetThreadPriority(
  HANDLE hThread   // handle to thread
);

创建一个线程,但是不要马上执行:

HANDLE hThread;
DWORD threadId;
hThread=CreateThread(NULL,0,THreadFunc,0,CREATE_SUSPENDED,&threadId);
一旦线程设定妥当,可以调用ResumeThread()开始执行。
DWORD ResumeThread(
  HANDLE hThread   // handle to thread
);

---挂起一个线程

SuspendThread()允许调用端指定一个线程睡眠。直到又有人调用了ResumeThread(),这个线程才会醒来。
DWORD SuspendThread(
  HANDLE hThread   // handle to thread
);
SuspendThread()的最大用途就是用来协调撰写调试器。调试器允许在程序的控制下,启动或停止任何一个线程。
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

xiaoding133

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值