首页 > 编程语言 > 详细

学习:多线程

时间:2020-02-01 14:53:24      阅读:76      评论:0      收藏:0      [点我收藏+]

正常的多线程实现方式:

CreateThread  创建线程
SuspendThread 挂起线程
ResumeThread  恢复线程
#include<windows.h>
#include<stdio.h>


DWORD WINAPI  MyThreadFun(LPVOID pParameter) {
    for (int i = 100; i > 0; i--) {
        printf("%d---MyThreadFun\n", i);
        Sleep(1000);
    }
    return 0;
}

int main() {
    HANDLE hThread;
    hThread = CreateThread(
        NULL,  //获取默认的安全描述符,当前用户的令牌权限 
        0,  //使用可执行文件的默认大小
        (LPTHREAD_START_ROUTINE)MyThreadFun,  // 创建线程调用的函数
        NULL,  // 传递函数中的参数
        0, //线程在创建后立即运行 
        NULL // 不返回线程标识符
    );
    printf("线程启动!\n");
    SuspendThread(hThread);
    printf("线程被挂起!\n");
    Sleep(5000);
    ResumeThread(hThread);
    Sleep(5000);
    printf("线程被恢复!\n");
    
    CloseHandle(hThread); // 线程被清理的两个必要条件:1、线程内核对象的计数器为0    2、线程的执行代码执行完毕 ,这里的话只有线程中执行完才会进行CloseHandle
    getchar();
    return 0;

}

技术分享图片

用CreateThread创建线程函数不一定需要定义为DWROD类型,并且具有返回值,如下也可以:但是需要注意的是在CreateThread中传参时候需要进行强转为(LPTHREAD_START_ROUTINE)类型才行

void MyThreadFun(LPVOID pParameter) {
    for (int i = 100; i > 0; i--) {
        printf("%d---MyThreadFun\n", i);
        Sleep(1000);
    }
}

对于以下的三个函数的作用:

WaitForSingleObject 当线程执行完毕之后,恢复阻塞,该函数具有局限性 只能等待单个线程执行完毕的情况
WaitForMultipleObjects 用来等待多个线程执行完毕的情况,上面的函数的升级版
GetExitCodeThread  用来得到线程函数的返回值
#include<windows.h>
#include<stdio.h>

void MyThreadFun(LPVOID pParameter) {
    for (int i = 5; i > 0; i--) {
        printf("%d---MyThreadFun\n", i);
        Sleep(500);
    }
}

int main() {
    
    HANDLE hThread;

    hThread = CreateThread(
        NULL,  //获取默认的安全描述符,当前用户的令牌权限 
        0,  //使用可执行文件的默认大小
        (LPTHREAD_START_ROUTINE)MyThreadFun,  // 创建线程调用的函数
        NULL,  // 传递函数中的参数
        0, //线程在创建后立即运行 
        NULL // 不返回线程标识符
    );
    printf("线程启动!\n");
    WaitForSingleObject(hThread, INFINITE); // 当线程执行完毕之后,恢复阻塞  ,该函数具有局限性 只能等待单个线程执行完毕的情况
    CloseHandle(hThread); // 线程被清理的两个必要条件:1、线程内核对象的计数器为0    2、线程的执行代码执行完毕 ,这里的话只有线程中执行完才会进行CloseHandle
    getchar();
    return 0;

}

技术分享图片


在单核CPU的机器中进行多线程运行的时候,一个单核执行多个任务。假如有10个任务,单核CPU执行了1个任务的百分之十,就会换另一个任务继续进行再到百分之十继续换,但是之前百分之十是如何进行保存的,多线程进行操作的时候,每个任务都会有一个context结构体,里面的寄存器用来保存当前任务的完成进度,下面两个函数就能对这个结构体进行获取/设置相应的值。

GetThreadContext 获取线程上下文
SetThreadContext 设置线程上下文
#include<windows.h>
#include<stdio.h>

void MyThreadFun(LPVOID pParameter) {
    for (int i = 5; i > 0; i--) {
        printf("%d---MyThreadFun\n", i);
        Sleep(500);
    }
}

int main() {
    HANDLE hThread;
    hThread = CreateThread(
        NULL,  //获取默认的安全描述符,当前用户的令牌权限 
        0,  //使用可执行文件的默认大小
        (LPTHREAD_START_ROUTINE)MyThreadFun,  // 创建线程调用的函数
        NULL,  // 传递函数中的参数
        0, //线程在创建后立即运行 
        NULL // 不返回线程标识符
    );

    WaitForSingleObject(hThread, INFINITE); // 当线程执行完毕之后,恢复阻塞  ,该函数具有局限性 只能等待单个线程执行完毕的情况
    printf("线程执行完毕!\n");

    CONTEXT cont;
    GetThreadContext(hThread, &cont);
    printf("eax: %x\nebx:%x\n",cont.Eax,cont.Ebx);

    cont.Eax = 0xccccccca;

    SetThreadContext(hThread, &cont);
    printf("eax: %x\nebx:%x\n", cont.Eax, cont.Ebx);
    CloseHandle(hThread); // 线程被清理的两个必要条件:1、线程内核对象的计数器为0    2、线程的执行代码执行完毕 ,这里的话只有线程中执行完才会进行CloseHandle
    getchar();
    return 0;

}

技术分享图片

学习:多线程

原文:https://www.cnblogs.com/zpchcbd/p/12248459.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!