C++多线程编程

上传人:jiups****uk12 文档编号:40017534 上传时间:2018-05-22 格式:DOC 页数:34 大小:268.50KB
返回 下载 相关 举报
C++多线程编程_第1页
第1页 / 共34页
C++多线程编程_第2页
第2页 / 共34页
C++多线程编程_第3页
第3页 / 共34页
C++多线程编程_第4页
第4页 / 共34页
C++多线程编程_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《C++多线程编程》由会员分享,可在线阅读,更多相关《C++多线程编程(34页珍藏版)》请在金锄头文库上搜索。

1、Visual C+多线程编程多线程编程Visual C+ 使您可以同时运行多个并行执行的线程。使用多线程编程,可以派生出后台任务、管理同时发生的输入流、管理用户界面,等等。本节内容本节内容使用 C 和 Win32 进行多线程编程 为创建 Microsoft Windows 多线程应用程序提供支持使用 C+ 和 MFC 进行多线程编程 描述什么是进程和线程以及 MFC 的多线程处理方法是什么。多线程和区域设置 讨论在多线程应用程序中使用 C 运行时库和标准 C+ 库的区域设置功能时引发的问题。相关章节相关章节CWinThread 表示应用程序中的执行线程。CSyncObject 描述一个纯虚类,

2、该类提供 Win32 中的同步对象所共有的功能。CSemaphore 表示一个信号量,是一个允许一个或多个进程中的有限多个线程访问一个资源的同步对象。CMutex 表示一个 mutex,是一个允许一个线程以互相排斥的方式访问一个资源的同步对象。CCriticalSection 表示一个临界区,是一个允许一个线程同时访问一个资源或代码段的同步对象。CEvent 表示一个事件,是一个允许一个线程通知另一个线程事件已经发生的同步对象。CMultiLock 表示多线程程序中用于控制对多个资源的访问的访问控制机制。CSingleLock 表示多线程程序中用于控制对一个资源的访问的访问控制机制。 添加功能

3、 提供有关下列内容的主题链接:描述有关 Visual C+ 库的概念信息和讨论各种编码技术和方法。Visual C+使用使用 C 和和 Win32 进行多线程编程进行多线程编程Microsoft Visual C+ 支持在 Microsoft Windows(Windows XP、Windows 2000、Windows NT、Windows Me 和 Windows 98)下创建多线程应用程序。如果您的应用程序需要管理多个活动(如同时进行键盘和鼠标输入),则您应当考虑使用多线程。一个线程可以处理键盘输入,而另一个线程可以筛选鼠标活动。第三个线程可以根据鼠标和键盘线程的数据更新显示屏幕。同时,

4、其他线程可以访问磁盘文件或从通信端口获取数据。使用 Visual C+ 的多线程编程有两种方式:使用 Microsoft 基础类库 (MFC),或使用 C 运行时库和 Win32 API。有关使用 MFC 创建多线程应用程序的信息,请先阅读以下使用 C 进行多线程处理的主题,再参见使用 C+ 和 MFC 进行多线程处理。这些主题介绍 Visual C+ 中支持创建多线程程序的功能。您想进一步了解什么?您想进一步了解什么?关于多线程处理 多线程处理的库支持 包含用于多线程处理的文件 线程控制的 C 运行时库函数 C 语言示例多线程程序 编写多线程 Win32 程序 编译和链接多线程程序 避免多线

5、程程序易出现的问题 线程本地存储 (TLS) 请参见请参见概念概念多线程编程Visual C+多线程程序多线程程序线程实质上是程序中的执行路径。也是 Win32 安排的最小执行单元。线程包括堆栈、CPU 寄存器的状态和系统计划程序执行列表中的项。每个线程共享所有进程的资源。进程包括一个或多个线程和代码、数据和内存中的其他程序资源。典型的程序资源是打开的文件、信号灯和动态分配的内存。当系统计划程序给予其中的一个线程执行控制时,即执行程序。计划程序确定应当运行哪些线程以及它们应当何时运行。较低优先级的线程可能必须等到较高优先级的线程完成任务后才能运行。在多处理器计算机上,计划程序可以将单个线程移到

6、不同的处理器以平衡 CPU 负荷。进程中的每个线程都独立运行。除非使这些线程相互可见,否则线程分别执行,对进程中的其他线程一无所知。线程共享公共资源,但是,必须使用信号灯或其他进程间的通信方法协调它们的工作。有关同步线程的更多信息,请参见编写多线程 Win32 程序。请参见请参见概念概念使用 C 和 Win32 进行多线程编程Visual C+多线程编程的库支持多线程编程的库支持现在,所有版本的 CRT 都支持多线程处理,但非锁定版本的某些函数除外。有关更多信息,请参见 Multithreaded Libraries Performance。 有关 CRT 版本的更多信息,请参见 C Run-

7、Time Libraries。Visual C+多线程编程的包含文件多线程编程的包含文件在库中实现 C 运行时库函数时,标准包含文件声明它们。如果使用完全优化 (/Ox) 或 fastcall 调用约定 (/Gr) 选项,编译器假设应使用寄存器调用约定调用所有函数。运行时库函数是使用 C 调用约定编译的,标准包含文件中的声明通知编译器生成对这些函数的正确外部引用。Visual C+线程控制的线程控制的 C 运行时库函数运行时库函数所有 Win32 程序都至少有一个线程。任何线程都可以创建附加线程。线程可以快速完成其工作,然后终止;也可以在程序的生存期内保持活动状态。LIBCMT 和 MSVCR

8、T C 运行时库提供以下用于创建和终止线程的函数:_beginthread, _beginthreadex 和 _endthread, _endthreadex。_beginthread 和 _beginthreadex 函数创建新线程;如果操作成功,则返回线程标识符。线程完成执行时自动终止,或者可通过调用 _endthread 或 _endthreadex 自行终止。注意注意 如果要从使用 Libcmt.lib 生成的程序调用 C 运行时例程,则必须使用 _beginthread 或 _beginthreadex 函数启动线程。不要使用 Win32 函数 ExitThread 和 Creat

9、eThread。如果有一个以上的线程在等待挂起的线程完成它对 C 运行时数据结构的访问时被阻塞,使用 SuspendThread 会导致死锁。_beginthread 和和 _beginthreadex 函数函数_beginthread 和 _beginthreadex 函数用来创建新线程。线程与进程中的其他线程共享进程的代码和数据段,但是线程具有自己的唯一寄存器值、堆栈空间和当前指令地址。系统给予每个线程 CPU 时间,使进程中的所有线程都可以同时执行。_beginthread 和 _beginthreadex 与 Win32 API 中的 CreateThread 函数类似,但有如下差异:

10、_beginthread 和 _beginthreadex 使您可以将多个参数传递到线程。它们初始化某些 C 运行时库变量。只有在线程中使用 C 运行时库时,这一点才很重要。CreateThread 帮助提供对安全属性的控制。可以使用此函数启动处于挂起状态的线程。如果成功的话,_beginthread 和 _beginthreadex 返回新线程的句柄;如果有错误的话,则返回错误代码。_endthread 和和 _endthreadex 函数函数_endthread 函数终止由 _beginthread 创建的线程(同样,_endthreadex 终止由 _beginthreadex 创建的线

11、程)。线程会在完成时自动终止。_endthread 和 _endthreadex 用于从线程内部进行条件终止。例如,专门用于通信处理的线程若无法获取对通信端口的控制,则会退出。Visual C+多线程多线程 C 程序示例程序示例Bounce.c 是一个示例多线程程序,每次键入字母 a 或 A 时,它都创建新线程。每个线程都在屏幕的周围弹出不同颜色的笑脸。最多可以创建 32 个线程。键入 q 或 Q 时,发生正常的程序终止。有关编译和链接 Bounce.c 的信息,请参见编译和链接多线程程序。示例示例复制代码 / sample_multithread_c_program.c / compile

12、with: /c / / Bounce - Creates a new thread each time the letter a is typed. / Each thread bounces a happy face of a different color around / the screen. All threads are terminated when the letter Q is / entered. /#include #include #include #include #include #include #define MAX_THREADS 32/ The funct

13、ion getrandom returns a random number between / min and max, which must be in integer range. #define getrandom( min, max ) (SHORT)(rand() % (int)(max) + 1) - (min) + (min)int main( void ); / Thread 1: main void KbdFunc( void ); / Keyboard input, thread dispat ch void BounceProc( void * MyID ); / Thr

14、eads 2 to n: display void ClearScreen( void ); / Screen clear void ShutDown( void ); / Program shutdown void WriteTitle( int ThreadNum ); / Display title bar information HANDLE hConsoleOut; / Handle to the console HANDLE hRunMutex; / “Keep Running“ mutex HANDLE hScreenMutex; / “Screen update“ mutexi

15、nt ThreadNr; / Number of threads started CONSOLE_SCREEN_BUFFER_INFO csbiInfo; / Console information int main() / Thread One / Get display screen information GetConsoleScreenBufferInfo( hConsoleOut, ClearScreen();WriteTitle( 0 );/ Create the mutexes and reset thread count.hScreenMutex = CreateMutex( NULL, FALSE, NULL ); / Cleared hRunMutex = CreateMutex( NULL, TRUE, NULL ); / Set ThreadNr = 0;/ Start waiting for keyboard input to dispatch threads or exit.KbdFunc();/ All threads done. Clean up handles.CloseHandle( hScreenMutex );CloseHandle( hRunMutex );CloseHan

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号