孙鑫VC视频教程笔记之第十五课“多线程与聊天室”

本文通过分析多线程程序的代码示例,详细讲解了线程的创建、运行以及线程间同步的概念。通过创建线程销售车票的例子,展示了线程竞争导致的问题和解决方案——使用互斥对象实现线程同步。最后,介绍了如何使用MFC创建基于多线程的聊天室程序,包括套接字库的加载、套接字的创建、接收和发送消息的实现,以及消息处理的线程设计。
摘要由CSDN通过智能技术生成
 

代码1分析:

说明:对于单核cpu的电脑来说,线程都在自己的时间片中运行,单位时间内,系统只能运行一个线程,交替运行;对于多核cpu或多cpu的电脑来说,才是真正意义上的单位时间内运行多个线程

 

说明:如果采用向导创建的Win32 Console程序选择的是空项目时,则以下使用方式是正确的,如果选择是”hello world”的简单应用程序时,则在main函数中想要使用输入输出流,则必须使用:

#include <iostream>

using namespace std;

 

#include <windows.h> //调用API函数

#include <iostream.h>

 

说明:程序有一个主线程,入口函数main,在主线程上可以创建新线程,入口函数定义成如下形式:

DWORD WINAPI ThreadProc1(LPVOID lpParameter); //函数声明

 

void main()

{

      HANDLE handle=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL); //创建新线程

 

      说明:调用CloseHandle函数并没有终止新创建的线程,只是表明在主线程中对新创建的线程的引用不是很感兴趣而已,所以在没有在做什么动作之前就关闭了,这个函数在主线程运行过程中必须调用,否则即使对应线程运行结束,对应句柄也是不会关闭的,知道主线程退出时,才会由系统集中清理。

      CloseHandle(handle);

      cout<<"main thread is running"<<endl;

 

      说明:如果不添加Sleep语句,主线程会在自己的时间片中运行完成后(该时间片在main函数,也就是主线程全部执行完毕后还有时间剩余),选择直接退出,主线程都退出了,依附于主线程的新线程也就不会有机会得到执行了,只有让主线程暂停执行(采用sleep函数),即挂起,让出执行的权利,操作系统会从等待的线程中选择一个来运行,那么新创建的线程得到机会执行

      Sleep(10);

}

 

DWORD WINAPI ThreadProc1(LPVOID lpParameter)

{

      cout<<"thread1 is running"<<endl;

      return 0;

}

 

输出结果:

main thread is running

thread1 is running

 

代码2分析:

添加全局变量

int index=0;

main函数中输出语句修改为:

while(index++<50)

      cout<<"main thread is running"<<endl;

将线程中输出语句修改为:

while(index++<50)

      cout<<"thread1 is running!"<<endl;

main函数中sleep语句省去

 

则得到的结果是:

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

thread1 is running!

thread1 is running!

thread1 is running!

thread1 is running!

thread1 is running!

thread1 is running!

thread1 is running!

thread1 is running!

thread1 is running!

thread1 is running!

thread1 is running!

thread1 is running!

thread1 is running!

thread1 is running!

thread1 is running!

thread1 is running!

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

main thread is running

 

结果说明主线程和副线程在交替运行,也就是主线程在它的时间片运行结束后,副线程得到执行的权利,在它自己所对应的时间片中运行,此时主线程其实还没有运行结束,它将等待着副线程运行结束后继续执行

 

代码3分析(车票的销售):

#include <windows.h>

#include <iostream.h>

 

DWORD WINAPI ThreadProc1(LPVOID lpParameter);

DWORD WINAPI ThreadProc2(LPVOID lpParameter);

 

int ticket=50;

 

void main()

{

      HANDLE handle1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);

      HANDLE handle2=CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);

      CloseHandle(handle1);

      CloseHandle(handle2);

 

      说明:为了使得主线程在退出之前保证副进程的执行完成,有些实现方法是采用恒真的空循环,单此种方法主线程会占用cpu的运行时间,如果采用Sleep

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值