• 学习:多线程


    正常的多线程实现方式:

    CreateThread  创建线程
    SuspendThread 挂起线程
    ResumeThread  恢复线程
    
    #include<windows.h>
    #include<stdio.h>
    
    
    DWORD WINAPI  MyThreadFun(LPVOID pParameter) {
    	for (int i = 100; i > 0; i--) {
    		printf("%d---MyThreadFun
    ", i);
    		Sleep(1000);
    	}
    	return 0;
    }
    
    int main() {
    	HANDLE hThread;
    	hThread = CreateThread(
    		NULL,  //获取默认的安全描述符,当前用户的令牌权限 
    		0,  //使用可执行文件的默认大小
    		(LPTHREAD_START_ROUTINE)MyThreadFun,  // 创建线程调用的函数
    		NULL,  // 传递函数中的参数
    		0, //线程在创建后立即运行 
    		NULL // 不返回线程标识符
    	);
    	printf("线程启动!
    ");
    	SuspendThread(hThread);
    	printf("线程被挂起!
    ");
    	Sleep(5000);
    	ResumeThread(hThread);
    	Sleep(5000);
    	printf("线程被恢复!
    ");
    	
    	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
    ", 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
    ", i);
    		Sleep(500);
    	}
    }
    
    int main() {
    	
    	HANDLE hThread;
    
    	hThread = CreateThread(
    		NULL,  //获取默认的安全描述符,当前用户的令牌权限 
    		0,  //使用可执行文件的默认大小
    		(LPTHREAD_START_ROUTINE)MyThreadFun,  // 创建线程调用的函数
    		NULL,  // 传递函数中的参数
    		0, //线程在创建后立即运行 
    		NULL // 不返回线程标识符
    	);
    	printf("线程启动!
    ");
    	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
    ", i);
    		Sleep(500);
    	}
    }
    
    int main() {
    	HANDLE hThread;
    	hThread = CreateThread(
    		NULL,  //获取默认的安全描述符,当前用户的令牌权限 
    		0,  //使用可执行文件的默认大小
    		(LPTHREAD_START_ROUTINE)MyThreadFun,  // 创建线程调用的函数
    		NULL,  // 传递函数中的参数
    		0, //线程在创建后立即运行 
    		NULL // 不返回线程标识符
    	);
    
    	WaitForSingleObject(hThread, INFINITE); // 当线程执行完毕之后,恢复阻塞  ,该函数具有局限性 只能等待单个线程执行完毕的情况
    	printf("线程执行完毕!
    ");
    
    	CONTEXT cont;
    	GetThreadContext(hThread, &cont);
    	printf("eax: %x
    ebx:%x
    ",cont.Eax,cont.Ebx);
    
    	cont.Eax = 0xccccccca;
    
    	SetThreadContext(hThread, &cont);
    	printf("eax: %x
    ebx:%x
    ", cont.Eax, cont.Ebx);
    	CloseHandle(hThread); // 线程被清理的两个必要条件:1、线程内核对象的计数器为0    2、线程的执行代码执行完毕 ,这里的话只有线程中执行完才会进行CloseHandle
    	getchar();
    	return 0;
    
    }
    

  • 相关阅读:
    OpenCV__Canny边缘检测和缩放(译)
    OpenCV_avi读入视频
    Canny边缘检测源码与图像结果(OpenCV2.0)
    OpenCV_累加一个三通道矩阵中的所有元素
    tomcat下出现 java.lang.OutOfMemoryError: Java heap space
    清空和截断数据库日志并收缩数据库
    java.lang.OutOfMemoryError: Java heap space 的解决
    java.lang.OutOfMemoryError: Java heap space 解决方法
    通达OA 2008 工作流数据库表的大致结构
    java获取本月的第一天和最后一天
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12248459.html
Copyright © 2020-2023  润新知