C++多线程编程入门

来源:互联网 发布:雷云网络不可用 编辑:程序博客网 时间:2024/05/16 15:35

创建线程的API函数

HANDLE CreateThread(   __in   SEC_ATTRS SecurityAttributes,   __in   ULONG StackSize,        // initial stack size   __in   SEC_THREAD_START StartFunction,   // thread function   __in   PVOID ThreadParameter,  // thread argument__in   ULONG CreationFlags,    // creation option    __out  PULONG ThreadId          // thread identifier                       );  

在这里我们只用到了第三个和第四个参数,第三个参数传递了一个函数的地址,也是我们要指定的新的线程,第四个参数是传给新线程的参数指针。

多线程编程示例1:

#include "stdafx.h"#include "iostream"#include <Windows.h>using namespace std;DWORD WINAPI Func(LPVOID lpParameter){    while (1)    {           cout << "Func Display!" << endl;        Sleep(500);    }}int _tmain(int argc, _TCHAR* argv[]){    HANDLE hThread = CreateThread(NULL,0,Func,NULL,0,NULL);    CloseHandle(hThread);    while (1)    {        cout << "Main Display!" <<endl;        Sleep(1000);    }    return 0;}

编译运行发现主线程(_tmain函数)和自定义进程(Func函数)是随机交替进行的;
其中Sleep()函数是用来暂停线程的执行的,原型如下:

VOID WINAPI Sleep(     __in  DWORD dwMilliseconds   ); 
参数dwMilliseconds单位是毫秒,比如Sleep(1000)表示暂停1秒;

共享资源独占

根据上述程序代码我们知道每当Fun函数和main函数输出内容后就会输出换行,但是根据运行结果我们看到的确是有的时候程序输出换行了,有的时候确没有输出换行,甚至有的时候是输出两个换行。这是什么原因呢?
将要输出endl(也就是清空缓冲区并换行,在这里我们可以不用理解什么事缓冲区),但此时main函数确得到了运行的机会,此时Fun函数还没有来得及输出换行就把CPU让给了main函数,而这时main函数就直接在Fun display!后输出main display!,至于为什么有的时候程序会连续输出两个换行,读者可以采用同样的分析方法来分析,在这里我就不多讲了,留给读者自己思考了。
这涉及到多线程的同步问题。对于一个资源被多个线程共用会导致程序的混乱,我们的解决方法是只允许一个线程
拥有对共享资源的独占,这样就能够解决上面的问题了。

HANDLE CreateMutex(          LPSECURITY_ATTRIBUTES lpMutexAttributes,           BOOL bInitialOwner,                // initial owner          LPCTSTR lpName                     // object name                        );      

该函数用于创造一个独占资源,第一个参数我们没有使用,可以设为NULL,第二个参数指定该资源初始是否归属
创建它的进程,第三个参数指定资源的名称。
调用代码示例如下:

HANDLE hMutex = CreateMutex(NULL,TRUE,"screen");   
这条语句创造了一个名为screen并且归属于创建它的进程的资源。
BOOL ReleaseMutex(HANDLE hMutex   // handle to mutex);  

该函数用于释放一个独占资源,进程一旦释放该资源,该资源就不再属于它了,如果还要用到,需要重新申请得到该资源。申请资源的函数如下:

DWORD WaitForSingleObject(       HANDLE hHandle,        // handle to object       DWORD dwMilliseconds   // time-out interval                             );   

第一个参数指定所申请的资源的句柄,第二个参数一般指定为INFINITE,表示如果没有申请到资源就一直等待该资源,如果指定为0,表示一旦得不到资源就返回,也可以具体地指定等待多久才返回,单位是毫秒。

多线程编程示例2:

#include "stdafx.h"#include "iostream"#include <Windows.h>using namespace std;HANDLE hMutex;DWORD WINAPI Func(LPVOID lpParameter){    while (1)    {           WaitForSingleObject(hMutex,INFINITE);        cout << "Func Display!" << endl;        Sleep(500);        ReleaseMutex(hMutex);    }}int _tmain(int argc, _TCHAR* argv[]){    HANDLE hThread = CreateThread(NULL,0,Func,NULL,0,NULL);    CloseHandle(hThread);    hMutex = CreateMutex(NULL,FALSE,_T("screen"));    while (1)    {        WaitForSingleObject(hMutex,INFINITE);        cout << "Main Display!" <<endl;        Sleep(1000);        ReleaseMutex(hMutex);    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩老爱玩不爱学习怎么办 小孩子不喜欢吃菜怎么办 孩子初中不爱学习怎么办 大学不爱学家长怎么办 小孩子不爱读书不听话怎么办 小孩不爱读书写字怎么办 一年级学生不爱学习怎么办 孩子练字怕累怎么办 孩子不愿意学英语怎么办 生了儿子 不喜欢 怎么办 养两个儿子的怎么办 看诗词记不住怎么办 经常读书记不住怎么办 孩子不爱记数字怎么办 考研学不进去怎么办 读了职高后悔怎么办 不喜欢看书的人怎么办 生的儿子不喜欢怎么办 孩子上网不回家怎么办 儿子不想读书了怎么办 中考体育考不好怎么办 小孩突然没礼貌怎么办 小孩读书记忆差怎么办 这几天不爱吃饭怎么办 读书读到不懂的怎么办 读书很多词不懂怎么办 看书看不进去怎么办 一年级小孩不喜欢读书怎么办 考研还不想学习怎么办 怎么吃还是瘦怎么办 要想读的书该怎么办 大人瘦不爱吃饭怎么办 大人不爱吃青菜怎么办 如果不想写作业怎么办 一年级不爱写作业怎么办 生气总打孩子怎么办 人爱喝酒怎么办才不改 俩岁半宝宝不吃饭怎么办 孩子高中不爱学习怎么办 10岁不愿意吃饭怎么办 儿童老是不睡觉怎么办