什么是多线程及实例 VC++
vc++2019 多线程编程例子

vc++2019 多线程编程例子当你在Visual Studio 2019中使用C++进行多线程编程时,你可以使用C++11标准中引入的`<thread>` 头文件来创建和管理线程。
以下是一个简单的例子,演示如何在VC++2019中使用多线程:```cpp#include <iostream>#include <thread>// 函数,将在新线程中运行void threadFunction(int id) {std::cout << "Thread " << id << " is running.\n";}int main() {// 启动三个线程std::thread t1(threadFunction, 1);std::thread t2(threadFunction, 2);std::thread t3(threadFunction, 3);// 等待线程完成t1.join();t2.join();t3.join();std::cout << "All threads have completed.\n";return 0;}```在这个例子中,`threadFunction` 函数将在新线程中运行,并且`main` 函数启动了三个不同的线程。
使用`join` 来等待线程的完成。
请确保在项目属性中的C++ 语言标准设置为C++11 或更高版本,以便支持`<thread>` 头文件。
在Visual Studio中,你可以通过右键单击项目,选择"属性",然后在"C/C++" -> "语言" 中设置"C++ 语言标准"。
记得在多线程编程中要小心处理共享资源,以避免竞态条件和其他并发问题。
多线程知识点总结归纳

多线程知识点总结归纳多线程知识点总结归纳如下:1. 线程和进程的区别- 进程是程序的一个执行实例,每个进程都有自己的独立内存空间、代码和数据,相互之间不会直接共享资源。
线程是在进程内部运行的一段代码,多个线程可以共享同一个进程的资源。
2. 多线程的优势- 提高程序的并发性和响应性,能够更有效地利用 CPU 资源。
- 使得程序能够更轻松地实现并发处理和多任务处理。
- 能够通过多线程实现一些复杂任务,如网络编程、图形界面等。
3. 多线程的基本概念- 线程调度:操作系统通过调度算法决定哪个线程应当运行,哪个线程应当阻塞或唤醒。
- 线程同步:多个线程访问共享数据时需要进行同步操作,以避免数据竞争和死锁等问题。
- 线程通信:多个线程之间需要进行通信,以进行资源共享或协作完成任务。
4. 多线程的创建和启动- 使用线程类:在 Java 中,可以通过继承 Thread 类或实现 Runnable 接口来创建线程。
- 线程生命周期:线程的生命周期包括新建、就绪、运行、阻塞和死亡等状态。
5. 线程的安全性- 多线程程序需要考虑线程安全性,以避免数据竞争和死锁等问题。
- 常用的线程安全性方法包括加锁、使用线程安全的数据结构和对象等。
6. 线程的调度- 多线程程序的运行顺序由操作系统的调度算法决定,而且在不同的操作系统上可能有不同的调度策略。
- 线程的调度策略包括抢占式调度和协作式调度等。
7. 线程的优先级- 线程的优先级决定了它在被调度时的优先级,可以通过设置线程的优先级来影响它的调度顺序。
8. 线程的阻塞和唤醒- 线程在执行过程中可能会因为某些原因而阻塞,需要等待一定的条件满足后才能被唤醒继续执行。
- 一些常见的线程阻塞和唤醒操作包括等待、通知、等待超时等。
9. 线程同步的方法- 使用锁机制:在多线程程序中通常使用锁来保护共享资源,以避免数据竞争和执行顺序问题。
- 使用同步代码块:通过 synchronized 关键字或 ReentrantLock 类等来创建同步代码块,保护共享资源的访问。
c 多线程实现的四种方式

c 多线程实现的四种方式C语言是一种非常流行的编程语言,它可以用来实现多线程编程。
多线程编程可以让你的程序更高效、更快速地运行,因为它可以同时执行多个任务。
在这篇文章中,我们将介绍 C 多线程实现的四种方式。
1. 使用 pthread 库pthread 是一个 POSIX 标准定义的多线程库,它提供了一套API 接口,可以用来实现多线程编程。
使用 pthread,你可以创建多个线程并且控制它们的行为。
这种方式是 C 语言实现多线程的最常用方式之一。
2. 使用 OpenMP 库OpenMP 是一个开源的多线程库,它可以用来在 C 语言中实现多线程编程。
OpenMP 提供了一套 API 接口,可以让你更方便地编写并行程序。
使用 OpenMP,你可以使用 #pragma 指令来控制并行执行的代码块。
3. 使用 POSIX 线程POSIX 线程是一种 POSIX 标准定义的多线程接口,它可以用来实现多线程编程。
与 pthread 类似,POSIX 线程提供了一套 API 接口,可以让你更方便地编写多线程程序。
4. 使用 Windows 线程如果你在 Windows 操作系统上编写 C 语言程序,你可以使用Windows 线程来实现多线程编程。
Windows 线程提供了一套 API 接口,可以让你在 Windows 平台上创建多个线程并且控制它们的行为。
总结以上是 C 多线程实现的四种方式。
在选择使用哪种方式时,你应该考虑自己的需求和使用的操作系统。
不同的方式会有不同的 API 接口、性能和可移植性。
如果你需要了解更多关于 C 多线程编程的知识,可以参考相关的书籍和教程。
对多线程的通俗理解

对多线程的通俗理解
通俗地讲,多线程是指在一个程序中同时运行多个线程,每个线程都是独立执行的,它们可以并发地进行不同的任务。
类比于生活中的工厂,可以将线程看作是工人,程序看作是工厂,不同的任务看作是不同的生产线。
多线程的好处在于可以提高程序的执行效率和响应速度。
举个例子,假设一个程序需要同时下载多个文件,如果使用单线程,需要逐个下载文件,而在下载一个文件时,其他文件必须等待,效率比较低。
而使用多线程,可以同时下载多个文件,每个线程负责一个文件的下载,这样可以加快下载速度。
当然,多线程也存在一些问题,比如线程之间的资源共享和同步问题。
在上述例子中,如果多个线程同时访问同一个文件保存路径,可能会引起冲突和错误。
为了解决这些问题,需要进行线程间的通信和协调,保证多个线程能够正确地共享和使用资源。
总而言之,多线程是一种并发执行任务的方式,通过同时运行多个线程,可以提高程序的执行效率和响应速度,但同时也需要注意线程间的资源共享和同步问题。
C#多线程详解(一)Thread.Join()的详解

C#多线程详解(⼀)Thread.Join()的详解什么是进程?当⼀个程序开始运⾏时,它就是⼀个进程,进程包括运⾏中的程序和程序所使⽤到的内存和系统资源。
⽽⼀个进程⼜是由多个线程所组成的。
什么是线程?线程是程序中的⼀个执⾏流,每个线程都有⾃⼰的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执⾏同样的函数。
什么是多线程?多线程是指程序中包含多个执⾏流,即在⼀个程序中可以同时运⾏多个不同的线程来执⾏不同的任务,也就是说允许单个程序创建多个并⾏执⾏的线程来完成各⾃的任务。
多线程的好处:可以提⾼CPU的利⽤率。
在多线程程序中,⼀个线程必须等待的时候,CPU可以运⾏其它的线程⽽不是等待,这样就⼤⼤提⾼了程序的效率。
多线程的不利⽅⾯:线程也是程序,所以线程需要占⽤内存,线程越多占⽤内存也越多;多线程需要协调和管理,所以需要CPU时间跟踪线程;线程之间对共享资源的访问会相互影响,必须解决竞⽤共享资源的问题;线程太多会导致控制太复杂,最终可能造成很多Bug;接下来将对C#编程中的多线程机制进⾏探讨。
为了省去创建GUI那些繁琐的步骤,更清晰地逼近线程的本质,接下来的所有程序都是控制台程序,程序最后的Console.ReadLine()是为了使程序中途停下来,以便看清楚执⾏过程中的输出。
⽰例:using System;using System.Threading;namespace Test{class TestThread{private static void FirstThreadFun(){for (int i = 0; i < 10; i++){Console.WriteLine( + " i = " + i);}Console.WriteLine( + " 执⾏完毕");}static void Main(string[] args){//程序调⽤了Main()函数时,就起动了⼀个进程,同时也启动了⼀个线程[这个线程就是主线程]. = "MainThread";//创建第⼀个线程Thread firstThread = new Thread(new ThreadStart(TestThread.FirstThreadFun));//取名为 firstThread = "firstThread";for (int z = 0; z < 20; z++){if (z == 10){firstThread.Start();firstThread.Join();}else{Console.WriteLine( + " z = " + z);}}Console.Read();}}}运⾏结果:总结:1.任何程序在执⾏时,⾄少有⼀个主线程。
c语言多线程编程实例

c语言多线程编程实例C语言多线程编程实例多线程编程是一种并发编程的方式,它可以让程序同时执行多个任务,提高程序的效率和响应速度。
C语言是一种广泛使用的编程语言,也支持多线程编程。
本文将介绍一些C语言多线程编程的实例,帮助读者更好地理解和掌握多线程编程技术。
1. 创建线程在C语言中,可以使用pthread库来创建线程。
下面是一个简单的例子,创建一个线程并让它输出一段文字:```#include <stdio.h>#include <pthread.h>void* thread_func(void* arg){printf("Hello, world!\n");return NULL;}int main(){pthread_t tid;pthread_create(&tid, NULL, thread_func, NULL);pthread_join(tid, NULL);return 0;}```在上面的代码中,我们定义了一个函数thread_func,它将作为线程的入口函数。
在main函数中,我们使用pthread_create函数创建了一个线程,并将thread_func作为入口函数。
然后使用pthread_join 函数等待线程结束。
2. 线程同步在多线程编程中,线程之间的同步非常重要。
下面是一个例子,演示如何使用互斥锁来保护共享资源:```#include <stdio.h>#include <pthread.h>int count = 0;pthread_mutex_t mutex;void* thread_func(void* arg){pthread_mutex_lock(&mutex);count++;printf("Thread %d: count = %d\n", (int)arg, count); pthread_mutex_unlock(&mutex);return NULL;}int main(){pthread_t tid1, tid2;pthread_mutex_init(&mutex, NULL);pthread_create(&tid1, NULL, thread_func, (void*)1); pthread_create(&tid2, NULL, thread_func, (void*)2); pthread_join(tid1, NULL);pthread_join(tid2, NULL);pthread_mutex_destroy(&mutex);return 0;}```在上面的代码中,我们定义了一个全局变量count,它将被两个线程同时访问。
《VC图像处理教案二:C++多线程并行处理技巧》
《VC图像处理教案二:C++多线程并行处理技巧》多线程并行处理技巧在现代计算机应用中,图像处理是一个普遍且重要的应用领域。
在图像处理过程中,有很多不同的算法和技巧可以用于处理和优化图像。
其中之一是多线程并行处理技巧,可以提高图像处理算法的效率和效果。
在VC++中,多线程并行处理技巧是一种很常见的图像处理方法。
多线程并行处理技巧可以将一个图像处理算法分成多个部分,同时使用多个线程来并行处理这些部分,从加快整个图像处理过程的速度,提高效率。
本教案将介绍如何使用C++多线程并行处理技巧来加速图像处理算法。
一、多线程并行处理原理在了解C++多线程并行处理技巧之前,我们需要先了解多线程并行处理的原理。
当我们要处理一个较大的图像时,可以将该图像分割成多个小块,然后使用多个线程来分别处理这些小块。
多个线程可以并行处理,从而可以提高处理速度。
在多线程并行处理中,需要注意线程之间的同步问题。
由于多个线程同时访问同一块内存区域时可能会发生冲突,因此需要使用同步机制来保证线程之间的正常运行。
二、C++多线程并行处理技巧下面我们将介绍如何使用C++多线程并行处理技巧来加速图像处理算法。
1.定义线程函数需要定义一个线程函数,该函数用于处理图像的一个小块。
线程函数的原型如下:```void ProcessImageBlock(ImageBlock block);```该函数接受一个图像块作为参数,然后对该块进行处理。
这个函数的实现可以根据具体的图像处理算法来确定。
2.分割图像随后,需要将整个图像分割成多个小块,每个小块都可以分配到一个线程上进行处理。
图像分割的方法可以根据具体的算法来确定,例如可以按照图像的列数或行数进行分割,也可以按照图像的位置来进行分割。
3.创建线程接下来,需要创建多个线程来处理分割后的图像块。
一般来说,可以根据处理器的核心数来确定线程的数量。
例如,如果处理器有8个核心,那么可以创建8个线程来并行处理图像块。
vs c 线程的用法
vs c 线程的用法一、引言在VisualStudio(VS)中,多线程是一种非常重要的功能,它可以使应用程序同时执行多个任务,从而提高程序的性能和响应能力。
在C语言中,多线程的实现通常需要借助操作系统提供的线程库。
本文将介绍如何在VisualStudio中使用C语言实现多线程,以及如何管理线程的生命周期和同步。
二、创建线程在C语言中,可以使用pthread库来创建线程。
在VisualStudio 中,可以使用P/Invoke调用pthread库中的函数来创建线程。
下面是一个简单的示例代码,演示如何在VisualStudio中使用C语言创建线程:```c#include<stdio.h>#include<pthread.h>void*threadFunction(void*arg){//线程执行的代码printf("Hellofromthread%ld!\n",(long)arg);returnNULL;}intmain(){pthread_tthreadId;intret=pthread_create(&threadId,NULL,threadFunction,(void *)123);if(ret!=0){printf("Errorcreatingthread:%d\n",ret);return1;}//等待线程结束pthread_join(threadId,NULL);return0;}```上述代码中,`pthread_create`函数用于创建一个新线程,第一个参数是新线程的标识符,第二个参数是线程属性,第三个参数是线程函数的地址,第四个参数是传递给线程函数的参数。
在主函数中,我们使用`pthread_join`函数等待新线程结束。
三、线程同步在多线程程序中,多个线程之间的数据访问可能会产生竞争条件,因此需要使用同步机制来确保数据的一致性和正确性。
多线程工作原理
多线程工作原理
多线程是指在一个程序中同时运行多个线程,每个线程都可以执行不同的任务。
多线程的工作原理是操作系统分配给每个线程一个时间片,使得每个线程按照一定的顺序交替执行,从而实现并发执行的效果。
具体来说,多线程的工作原理包括以下几个方面:
1. 线程调度:操作系统根据一定的调度算法,给每个线程分配一个时间片,使得每个线程都能得到执行的机会。
线程调度可以采用抢占式调度或协作式调度。
2. 上下文切换:当一个线程的时间片用完或者被其他高优先级的线程抢占时,操作系统会进行上下文切换,将当前线程的状态保存下来,并加载下一个要执行的线程的状态。
这个过程包括保存和恢复线程的寄存器、堆栈和程序计数器等状态信息。
3. 共享资源的互斥访问:多个线程在同时访问共享资源时可能产生冲突,为了避免数据不一致的问题,需要采取同步机制,如互斥锁、条件变量等,来保证只有一个线程可以访问共享资源。
4. 线程间的通信:多个线程之间通常需要进行数据交换和同步,可以通过共享内存、消息队列、管道、信号量等机制来实现线程间的通信。
总之,多线程的工作原理是操作系统通过调度和切换线程的方
式,使得多个线程可以并发执行,并通过同步和通信机制来保证线程之间的正确交互。
用VC实现多串口多线程工业控制
用VC实现多串口多线程工业控制随着工业自动化程度的不断提高,多串口多线程工业控制成为了现代工业系统中的重要组成部分。
使用虚拟串口技术(Virtual COM,简称VC)可以实现多串口多线程工业控制,从而提高工业生产效率和减少人力成本。
本文将详细介绍VC实现多串口多线程工业控制的原理、优势以及应用案例。
一、VC实现多串口多线程工业控制的原理1.1VC基本原理VC技术是一种软件技术,通过创建虚拟串口,将物理串口映射到虚拟串口,使得能够在多个进程或线程之间进行并行通信。
虚拟串口与物理串口完全相同,可以实现对串口的访问和管理,但能够同时在多个线程中使用。
1.2多线程工业控制的基本原理多线程工业控制是指通过多个线程同时进行工业控制操作,实现对多个设备或工艺流程的并行控制。
每个线程负责一个设备或工艺流程的控制,通过线程之间的协同工作,完成整个系统的工业控制过程。
二、VC实现多串口多线程工业控制的优势2.1提高工业生产效率使用VC技术可以实现多个设备或工艺流程的同时控制,减少了串口访问的瓶颈,提高了工业生产效率。
不同设备或工艺流程之间可以同时进行通信和控制,大大缩短了系统的响应时间,提高了整个系统的响应速度。
2.2减少人力成本传统的工业控制系统通常需要大量的人工干预和操作,而使用VC实现多串口多线程工业控制可以实现自动化控制,减少了人力成本。
多个设备或工艺流程之间可以实现自动化交互和控制,减少了人力的干预和操作,提高了工业生产的自动化程度。
2.3提高系统的稳定性和可靠性VC技术可以实现对串口的访问和管理,有效地解决了串口冲突和资源竞争的问题,提高了系统的稳定性和可靠性。
多个设备或工艺流程之间可以独立运行,互不干扰,保证系统的稳定运行。
三、VC实现多串口多线程工业控制的应用案例3.1智能生产线控制系统智能生产线控制系统通常需要对多个设备进行控制和监控,使用VC技术可以实现多串口多线程的工业控制。
每个设备负责一个工序或操作,通过多线程的方式实现对多个设备的并行控制,提高了生产线的效率和稳定性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、什么是多线程?为了了解线程的概念,我们必须先讨论一下进程的概念。
一个进程通常定义为程序的一个实例。
在Win32中,进程占据4GB的地址空间。
与它们在MS-DOS和16位Windows操作系统中不同,Win32进程是没有活力的。
这就是说,一个Win32进程并不执行什么指令,它只是占据着4GB的地址空间,此空间中有应用程序EXE文件的代码和数据。
EXE需要的任意DLL也将它们的代码和数据装入到进程的地址空间。
除了地址空间,进程还占有某些资源,比如文件、动态内存分配和线程。
当进程终止时,在它生命期中创建的各种资源将被清除。
但是进程是没有活力的,它只是一个静态的概念。
为了让进程完成一些工作,进程必须至少占有一个线程,所以线程是描述进程内的执行,正是线程负责执行包含在进程的地址空间中的代码。
实际上,单个进程可以包含几个线程,它们可以同时执行进程的地址空间中的代码。
为了做到这一点,每个线程有自己的一组CPU寄存器和堆栈。
每个进程至少有一个线程在执行其地址空间中的代码,如果没有线程执行进程地址空间中的代码,进程也就没有继续存在的理由,系统将自动清除进程及其地址空间。
为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮转方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。
创建一个Win32进程时,它的第一个线程称为主线程,它由系统自动生成,然后可由这个主线程生成额外的线程,这些线程,又可生成更多的线程。
【多线程编程的步骤】1、编写线程函数所有线程必须从一个指定的函数开始执行,该函数称为线程函数,它必须具有下列原型:DWORDWINAPIYourThreadFunc(LPVOIDlpvThreadParm);该函数输入一个LPVOID型的参数,可以是一个DWORD型的整数,也可以是一个指向一个缓冲区的指针,返回一个DWORD型的值。
象WinMain函数一样,这个函数并不由操作系统调用,操作系统调用包含在KERNEL32.DLL中的非C运行时的一个内部函数,如StartOfThread,然后由StartOfThread函数建立起一个异常处理框架后,调用我们的函数。
以下代码为两个线程函数:显示代码打印void FunCount(PVOID arg){while(1){printf("funcout is executing.....\n");Sleep(10000);}}void Function1(PVOID arg){while(1){printf("function1 is executing.....\n");Sleep(20000);}}2、创建一个线程一个进程的主线程是由操作系统自动生成,如果你要让一个主线程创建额外的线程,你可以调用来CreateThread完成。
HANDLECreateThread(LPSECURITY_ATTRIBUTESlpsa,DWORDcbstack,LPTHREAD_START_ROUTINElpStartAddr,LPVOID lpvThreadParm,DWORDfdwCreate,LPDWORDlpIDThread);其中lpsa参数为一个指向SECURITY_ATTRIBUTES结构的指针。
如果想让对象为缺省安全属性的话,可以传一个NULL,如果想让任一个子进程都可继承一个该线程对象句柄,必须指定一个SECURITY_ATTRIBUTES结构,其中bInheritHandle成员初始化为TRUE。
参数cbstack表示线程为自己所用堆栈分配的地址空间大小,0表示采用系统缺省值。
参数lpStartAddr用来表示新线程开始执行时代码所在函数的地址,即为线程函数。
lpvThreadParm为传入线程函数的参数,fdwCreate参数指定控制线程创建的附加标志,可以取两种值。
如果该参数为0,线程就会立即开始执行,如果该参数为CREATE_SUSPENDED,则系统产生线程后,初始化CPU,登记CONTEXT结构的成员,准备好执行该线程函数中的第一条指令,但并不马上执行,而是挂起该线程。
最后一个参数lpIDThread 是一个DWORD类型地址,返回赋给该新线程的ID值。
此外,还可以使用_beginthread等函数来创建线程。
handle=(HANDLE)_beginthread(FunCount,0, NULL);handle1=(HANDLE)_beginthread(Function1,0,NULL);记得要把process.h头文件include进来哦!3、终止线程如果某线程调用了ExitThread 函数,就可以终止自己。
VOIDExitThread(UINTfuExitCode );这个函数为调用该函数的线程设置了退出码fuExitCode后,就终止该线程。
调用TerminateThread函数亦可终止线程。
BOOLTerminateThread(HANDLE hThread,DWORDdwExitCode);该函数用来结束由hThread参数指定的线程,并把dwExitCode设成该线程的退出码。
当某个线程不在响应时,我们可以用其他线程调用该函数来终止这个不响应的线程。
4、设定线程的相对优先级当一个线程被首次创建时,它的优先级等同于它所属进程的优先级。
在单个进程内可以通过调用SetThreadPriority函数改变线程的相对优先级。
一个线程的优先级是相对于其所属的进程的优先级而言的。
BOOLSetThreadPriority(HANDLE hThread,intnPriority);其中参数hThread是指向待修改优先级线程的句柄,nPriority可以是以下的值:THREAD_PRIORITY_LOWEST,THREAD_PRIORITY_BELOW_NORMAL,THREAD_PRIORITY_NORMAL,THREAD_PRIORITY_ABOVE_NORMAL,THREAD_PRIORITY_HIGHEST5、挂起及恢复线程先前我提到过可以创建挂起状态的线程(通过传递CREATE_SUSPENDED标志给函数CreateThread来实现)。
当你这样做时,系统创建指定线程的核心对象,创建线程的栈,在CONTEXT结构中初始化线程CPU注册成员。
然而,线程对象被分配了一个初始挂起计数值1,这表明了系统将不再分配CPU去执行线程。
要开始执行一个线程,另一个线程必须调用ResumeThread并传递给它调用CreateThread时返回的线程句柄。
DWORD ResumeThread(HANDLEhThread);一个线程可以被挂起多次。
如果一个线程被挂起3次,则该线程在它被分配CPU之前必须被恢复3次。
除了在创建线程时使用CREATE_SUSPENDED标志,你还可以用SuspendThread函数挂起线程。
DWORDSuspendThread(HANDLE hThread);、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、二中的多线程示例代码均已在VS2010中测试实现(QQ417824015)、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、二、VC 多线程编程2.1、问题的提出编写一个耗时的单线程程序:新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX_SECOND,标题为“延时6秒”,添加按钮的响应函数,代码如下:void CSingleThreadDlg::OnSleepSixSecond(){Sleep(6000); //延时6秒}编译并运行应用程序,单击“延时6秒”按钮,你就会发现在这6秒期间程序就象“死机”一样,不在响应其它消息。
为了更好地处理这种耗时的操作,我们有必要学习——多线程编程。
2.2、多线程概述进程和线程都是操作系统的概念。
进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。
线程是进程内部的一个执行单元。
系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如main或WinMain函数,将程序的启动点提供给Windows系统。
主执行线程终止了,进程也就随之终止。
每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。
用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。
一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。
多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。
要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。
由此可见,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,反而会降低系统的性能。
这一点在多线程编程时应该注意。
Win32SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。
VisualC++6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。
2.3、Win32 API对多线程编程的支持Win32提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作。
下面将选取其中的一些重要函数进行说明。
1、HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄,其中各参数说明如下:lpThreadAttributes:指向一个SECURITY_ATTRIBUTES结构的指针,该结构决定了线程的安全属性,一般置为NULL;dwStackSize:指定了线程的堆栈深度,一般都设置为0;lpStartAddress:表示新线程开始执行时代码所在函数的地址,即线程的起始地址。