可以做qq空间背景音乐的网站破解WordPress站点
今天,在C++的基础上来进行提升,学习VC++多线程编程。
线程:是为了提高系统内程序的并发执行程度而提出来的概念,他是比进程更小的能独立运行的基本单位。
线程的组成:
创建线程的方法与区别:(C/C++/MFC)线程的内核对象:操作系统用它来对线程实施管理;内核对象也是系统用来存放线程统计信息的地方。
线程栈:它用于维护线程在执行代码时所需要的所有函数参数和局部变量。
1.CreateThread()----WIN32API函数;
2._beginthreadx()----MS对C Runtime库的扩展SDK函数;
3.AfxBeginThread()----MFC中创建线程的函数。
CreateThread:函数原型如下
lpThreadAttributes:指向SECURITY_ATTRIBUTES结构体指针,传递为NULL,让线程使用默认安全性;
dwStackSize:设置线程初始化栈大小,为0则默认使用与调用该函数的线程相同的栈空间大小;
lpStartAddress:线程回调函数;
lpParameter:参数;
dwCreationnFlags:设置用于控制线程创建的附加标记;值若为0,线程创建之后立即运行;
lpThreadId:线程ID。
#include "stdafx.h" #include <iostream.h> #include <windows.h> DWORD WINAPI Func(LPVOID lpParameter) {cout<<"子线程在运行..."<<endl;return 0; } int main(int argc, char* argv[]) {HANDLE h1;//创建线程句柄h1 = CreateThread(NULL,0,Func,NULL,0,NULL);//创建线程cout<<"主线程在运行..."<<endl;Sleep(100);CloseHandle(h1);//关闭线程句柄return 0; }
AfxBeginThread():函数原型如下
线程终止运行:最好的方式是让线程函数自动返回。CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,LPVOID pParan,int nPriority=THREAD_PRIORITY_NORMAL,UINT nStackSize=0,DWORD dwCreateFlag=0,LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL );
有关线程的函数:
暂停:DWORD SuspendThread(HANDLE hThread);
恢复:DWORD ResumeThread(HANDLE hThread);
睡眠:VOID Sleep(DWORD dwMilliseconds);
Sleep函数可使线程资源放弃它的剩余时间片;Sleep(n)系统将会在n毫秒内线程不可调度;Sleep(0)告诉系统调用线程释放剩余时间片。并迫使系统重新调度线程。
切换:BOOL SwicthToThread(VOID);与Sleep(0)相似;不同之处在于允许优先级较低的线程运行。
线程同步的方法:
死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。临界区同步:临界区是指包含共享资源的一段代码块;
内核同步(信号量、互斥量、事件)。
以下代码列出了临界区同步与互斥量同步。
#include "stdafx.h" #include <windows.h> #include <iostream.h> DWORD WINAPI Func1(LPVOID lpPraam); DWORD WINAPI Func2(LPVOID lpParam); //定义全局变量 int count=1000; //定义临界区 CRITICAL_SECTION cs; //定义互斥对象句柄 HANDLE hMutex; int main(int argc, char* argv[]) {//初始化临界区------1InitializeCriticalSection(&cs);//创建互斥对象------2hMutex = CreateMutex(NULL,FALSE,NULL);//创建两个线程HANDLE h1 = CreateThread(NULL,0,Func1,NULL,0,NULL);HANDLE h2 = CreateThread(NULL,0,Func2,NULL,0,NULL);//等待线程结束WaitForSingleObject(h1,INFINITE);WaitForSingleObject(h2,INFINITE);//释放临界区DeleteCriticalSection(&cs);//关闭互斥量句柄CloseHandle(hMutex);//关闭线程句柄CloseHandle(h1);CloseHandle(h2);return 0; } //线程1回调函数 DWORD WINAPI Func1(LPVOID lpPraam) {while (TRUE){if(count>0){//进入临界区//EnterCriticalSection(&cs);WaitForSingleObject(hMutex,INFINITE);cout<<"线程1:"<<count--<<endl;//离开临界区//LeaveCriticalSection(&cs);ReleaseMutex(hMutex);}else{break;}}return 0; } //线程2回调函数 DWORD WINAPI Func2(LPVOID lpPraam) {while (TRUE){if(count>0){//EnterCriticalSection(&cs);WaitForSingleObject(hMutex,INFINITE);cout<<"线程2:"<<count--<<endl;//LeaveCriticalSection(&cs);ReleaseMutex(hMutex);}else{break;}}return 0; }
![]()