网络编程——多线程技术

    多线程共存于应用程序中是现代操作系统中的基本特征和重要标志。为了提高程序的运行效率,在操作系统中提出了进程和线程的概念,在一个进程中可以包含多个线程,进程作为资源分配的基本单位,线程作为独立运行和独立调度的基本单位。既然提到了进程和线程,就涉及到进程(线程)的并发执行以及互斥对象的访问。这些在网络编程中都是十分重要的知识点。具体操作系统的知识就不做介绍了,下面通过实例详细介绍网络编程中的多线程技术。

    在程序运行时,操作系统会创建一个进程,同时就会产生一个主线程,我们可以在主线程中继续创建线程,来完场我们制定的操作。

    1、创建线程,要用到创建线程的函数CreateThread(),这个函数的第三个参数制定了新创建线程的线程函数,该线程的所有操作都可以在该线程函数中完成。线程函数可以参看MSDN的详细用法。线程函数的形式如下:DWORD WINAPI ThreadProc(LPVOID lpParameter);每一个线程都有一个线程句柄与之相关联。

    2、线程同步:在一个进程中可以创建多个线程,这多个线程在需要访问同一个资源时,肯定会发生争用现象,在争夺资源的过程中,加入第一个线程先访问这一资源,并对其做了修改,在这个线程没有执行完毕但时间片到了,第二个线程又访问该资源,就可能得到错误的结果。这是非常严重的问题。为了解决这一问题,引入了进程同步的概念,我们可以创建互斥对象来解决这一问题。创建互斥对象后,某线程只有得到互斥对象的访问权后,才可以访问临界资源,即使该线程的时间片到,如果该线程不释放互斥对象的使用权,下一个线程由于获得不到互斥对象,导致第二个线程无法访问临界资源。这就防止了线程在争夺资源的过程中发生不可预知的错误。创建互斥对象的函数为:CreateMutex(),该函数返回互斥对象的句柄。

    3、获得临界资源的访问权:通过调用函数WaitForSingleObject()可以获得临界资源的访问权,如果得到访问权后,该线程不主动释放该互斥对象,即使该线程的时间片到,下一个线程由于不能得到访问权而不能访问临界资源。

    4、释放互斥对象:该线程访问临界资源完毕,应该释放互斥对象,让其他线程有机会获得访问临界资源的权利。释放互斥对象可以调用函数ReleaseMutex()来实现。

注意:

1、互斥对象是和线程相关的,哪个线程需要访问临界资源,必须在该线程内部调用WaitForSingleObject()函数

2、线程执行完毕,应释放互斥对象。必须是“谁拥有谁释放”,必须在线程执行完毕之前释放,不能在下一个线程的开始释放。因为互斥对象是和线程相关的,里面维护有线程句柄来识别时哪个线程调用该函数。

3、“拥有几次释放几次”:在互斥对象内部维护有一个计数器,可以统计获得互斥对象的次数,只有计数器为零时,下一个线程才可以获得该互斥对象。所以调用几次获得函数就需要释放几次。

下面通过一个火车售票系统的简化模型来具体实现多线程技术的应用:

    假设共有100张火车票可以卖出,现在有两个线程都可以卖票,为了使卖票系统不会出现差错,就需要用到互斥对象。示例代码如下:

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;

DWORD WINAPI ThreadProc1(
 LPVOID lpParameter   // thread data
 );
DWORD WINAPI ThreadProc2(
 LPVOID lpParameter   // thread data
 );

int tickets=100;
HANDLE hMutex;
int _tmain(int argc, _TCHAR* argv[])
{
 HANDLE hThread1;
 HANDLE hThread2;
 hThread1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);//创建线程1
 hThread2=CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);//创建线程2
 CloseHandle(hThread1);
 CloseHandle(hThread2);
 hMutex=CreateMutex(NULL,TRUE,NULL);//创建互斥对象
 ReleaseMutex(hMutex);//必须在主线程中释放互斥对象
 Sleep(1000);//必须让主线程暂停执行,如果主线程退出了,其他线程就不复存在了
 system("pause");
 return 0;
}

/****************************************************************

                                线程函数的实现

******************************************************************/

DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
 while (TRUE)
 {
  WaitForSingleObject(hMutex,INFINITE);
  if (tickets>0)
  {
   Sleep(1);
   cout<<"Thread1 sell tickets:"<<tickets--<<endl;
  }
  else
   break;
  ReleaseMutex(hMutex);
 }
 return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{
 while (TRUE)
 {
  WaitForSingleObject(hMutex,INFINITE);
  if (tickets>0)
  {
   Sleep(1);
   cout<<"Thread2 sell tickets:"<<tickets--<<endl;
  }
  else
   break;
  ReleaseMutex(hMutex);
 }
 return 0;
}

运行结果如下:

在上面这个示例中,在主线程中创建互斥对象后,必须释放互斥对象,线程1和线程2才有机会拥有互斥对象的所有权。

转载于:https://www.cnblogs.com/chengfeng736/archive/2011/10/14/2212084.html

掌握多线程和MFC的网络编程实战 多线程技术是现代软件开发中不可或缺的一部分,它允许一个应用程序同时执行多个线程,这些线程可以并行处理多项任务,有效提高程序性能和用户体验。随着计算机技术的进步,多线程概念从最初的简单线程管理,逐步发展到支持并发执行的高级特性。客户端-服务器(Client-Server,简称C/S)模式是一种常见的计算机网络通信架构。在这种模式中,客户端(Client)通常是一个请求信息或服务的程序,而服务器(Server)则是提供这些信息或服务的程序。 阅读详情

相关推荐

URDF模型转换实战:解决SolidWorks到Gazebo的五大常见问题

本文详细解析了从SolidWorks导出URDF模型到Gazebo仿真过程中常见的五大问题及解决方案,包括插件安装、坐标系建立、Link与Joint配置等关键步骤。通过实战经验分享,帮助机器人仿真工程师高效完成模型转换,确保Gazebo仿真准确性。

weixin_29052717的博客 445

多线程技术(全面介绍)

最全的多线程介绍。从概念到掌握技术。

m0_60563771的博客 5680

01|无代码开发 | 如何使用Zion实现导航网站制作

以上就是我制作导航网站的心得,分享给大家,作为一个小白想要独立搭建一个网站还是比较困难的,而在Zion不仅可以用可视化的方法进行搭建,甚至还可以一键发布,不用考虑服务器域名啥的问题,真是太方便了。

2301_76262110的博客 1390

Java 多线程两种创建和使用方式、线程生命周期、Thread常用函数、线程同步(安全)

                            Thread类中的常用的方法 start():启动当前线程;调用当前线程的run() run(): 通常需要重写Thread类中的此方法,将创建的线程要执行的操作

god_sword_的博客 298

C#与YOLOv8工业缺陷检测实战:从算法到PLC集成的工程化落地

目标检测作为计算机视觉的核心任务,其原理是通过深度学习模型在图像中定位并识别物体。这项技术的关键价值在于将AI的感知能力转化为实际生产力,尤其在工业自动化领域,它能实现高效、精准的视觉检测。在工业缺陷检测这一典型应用场景中,稳定性和实时性是核心挑战。本文聚焦于如何将YOLOv8这一先进的目标检测模型,与C#上位机开发及工业相机硬件深度集成,构建一个能够7x24小时稳定运行的智能检测系统。文章深入探讨了从模型训练、ONNX部署,到与PLC通信联调的完整工程化路径,并针对工业环境中常见的稳定性、性能及调试问题提

weixin_33508411的博客 236

WRF气象建模实战:如何为JRA55非标准数据定制Vtable文件?

本文详细介绍了为WRF气象模型定制Vtable文件以支持JRA55非标准数据(特别是积雪数据)的完整实战流程。文章深入解析了WPS数据流中Vtable的核心映射逻辑,提供了从GRIB文件诊断、Vtable编写到METGRID.TBL调优的通用方法论,帮助用户解决非标准气象数据源适配的关键技术挑战。

c8d9e0f1的博客 673

Java多线程实现TCP网络Socket编程(C/S通信)

本篇详细记录实现java多线程通信,目标达到客户端可以一次接收服务器发送的多条信息,避免阻塞。将客户端接收信息功能独立为一个线程来完成,进一步完善TCP的Socket网络通信,C/S软件架构的程序设计!

陆海潘江的博客 1万+

基于FPGA的工业相机项目大赏1——cmos线阵相机

●CMOS CL0402 作为图像传感芯片,曝光后产生一定格式的图像数据;●FPGA ZYNQ7020 作为主控芯片负责cmos驱动控制、图像像素的采集、cmos寄存器的配置、cameralink协议的实现、上位机串口通信的实现;●Cameralink端子实现图像数据的高速串行发送,将数据传送至采集卡PC端。系统工作流程如下: FPGA 上电加载配置程序,计算机通过异步串口向 FPGA 发送控制信息,FPGA对接收的控制信息进行分析判断。

weixin_41895751的博客 6402

网络多线程

1. Netty 原理 Netty 是一个高性能、异步事件驱动的 NIO 框架,基于 JAVA NIO 提供的 API 实现。它提供了对TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。 2. Netty 高性能 在 IO 编程过程中,当需要同时处理多个客户端接入请求时,可以利用多线程或者 IO 多路复用技术进行处理。IO 多路复用技术通过把多个

m0_53080414的博客 603

MicroCap声学仿真介绍(五)-倒相管扬声器系统仿真

实际倒相管的扬声器单体选择、后腔容积、倒相管的直径和长度都是需要精心挑选的,为了便于演示,随意指定了倒相管的长度和直径,现实中还是不能这么随便的。之前介绍了封闭式扬声器的仿真,今天在封闭式扬声器的基础上,再介绍一下倒相管扬声器系统的仿真。

山无忧的博客 1718

数据中台:大数据平台,数据仓库(DM),数据中台之间的联系以及异同分析

大数据平台是一个技术平台。这个技术平台提供了对于大数据的分布式采集,存储,流处理和计算,实时分析等能力。在没有大数据平台前也有数据集成和管理的平台,这种平台可以实现对结构化数据本身的采集,集成和管理。 管理平台,是在原生的大数据生态的基础之上,为了更好的管理集群服务,管理集群的资源,提供灵活SRE能力和资源核算审计能力的一系列工具和合称整体架构数据中台包括数据仓库的全部内容,数据仓库为数据中台提供了数据对外提供服务的基础资源,数据中台将数据仓库建设的投入价值进行最大化,以加快数据赋能业务的速度大家都知道数据

GIS摆渡人 2134

Java的多线程基础、创建线程和线程同步

进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

yuDong1109的博客 375

Electron vue3 - 使用SerialPort与串口交互教程,计算机串行端口(COM口、USB转串口等)进行通信连接读取或写入Arduino、单片机、PLC、扫码枪、打印机、老式调制解调器!

实战Electron使用SerialPort与串口交互详细全过程,Electron-vue3与串口交互示例,Electron vue使用serialport实现串口交互通讯,Electron-vue使用serialport连接本地串口,electron-vue 台称串口对接 SerialPort,electron串口调试工具,electron+vue+serialport实现串口通信,串口通信serialport使用和调试,electron-vue使用serialport串口通信及踩过的坑(已解决!)ele

🏆 前端领域优质创作者 4641

Windows网络编程 | 深入了解TCP/IP协议与多线程技术实现

此外,许多平台还提供互动式的学习模式,学员可以通过实时编程,解决问题并提高自己的编码能力。大多数在线编程平台还提供了丰富的课程内容,从基础的编程语言如Python、Java到更复杂的算法和数据结构课程,适合不同层次的学习者。无论你是初学者,还是有一定基础的开发者,在线平台都有适合你的课程和练习。因此,确保网络通信的安全性是至关重要的,可以通过SSL/TLS等加密协议来保障数据的隐私性和完整性。另外,许多平台还提供了即时的代码检查和评估系统,帮助学习者快速了解自己的学习进度和存在的不足之处。

jjguyj_119的博客 269

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java并发编程技术知识点梳理(第五篇)多线程与网络编程

多线程在网络编程中的应用

yemuxiaweiliang的博客 420

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

网络编程——多线程技术实现网络聊天程序

最近学习了网络编程,在学习多线程技术后,就尝试着用多线程技术写了一个网络聊天程序。下面介绍一下具体的实现过程。 既然是聊天程序,肯定要发送数据和接收数据,这里我新创建了一个线程来接收数据,用主线程来发送数据。同一个进程中的两个线程可以独立运行并相互交通信。因此可以实现数据的接收和发送。 先建立一个基于对话框的应用程序,并在对话框上放置接收数据的编辑框、发送数据...

HeartHelp2013的博客 883

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android xml java混合编程_Java注解与多线程及网络编程与XML技术解析

本部分内容主要有集合框架及泛型,实用类,输入和输出处理,注解与多线程,网络编程与XML技术。初次学习这部分会感觉很难,主要是概念难于理解,最好是多看看例子,多练习。下面是个人的总结一、集合框架及泛型1、集合框架是一套性能优良、使用方便的接口和类(位于java.util包中)解决数组在存储上不能很好适应元素数量动态变化,查找效率低的缺陷集合接口: Map、Collection(子接口List、Set...

weixin_39543652的博客 140

java多线程编程_Java学习中注解与多线程,网络编程与XML技术

本部分内容主要有集合框架及泛型,实用类,输入和输出处理,注解与多线程,网络编程与XML技术。初次学习这部分会感觉很难,主要是概念难于理解,最好是多看看例子,多练习。下面是个人的总结 拉勾IT课小编为大家分解一、集合框架及泛型1、集合框架是一套性能优良、使用方便的接口和类(位于java.util包中)解决数组在存储上不能很好适应元素数量动态变化,查找效率低的缺陷集合接口: Map、Collectio...

weixin_39841640的博客 248

利用Java中的IO流,多线程及网络编程技术自制一个简易的多人聊天室

    在java基础课程中,IO流,多线程以及网络编程都属于java高级部分的内容,这部分内容虽然不算复杂,不难以理解,但是在学习和应用中往往要求我们将它们一起理解、运用,因此常常会让我们感到不知从何处下手,那么,我们可以通过一个简易的多人聊天室的项目,来综合运用这部分知识点,帮助我们更好地掌握和理解这部分知识 package com.softeem.TalkRoom.server; /**...

qq_42017374的博客 1501

【网络编程基础(二)】POSIX多线程技术

线程的概念、线程和子进程的区别、线程的实现

paidaxing_s的博客 1370

JAVA网络编程技术 - UDP练习,模仿多线程聊天室

今天学习了网络编程技术,了解了一些基本知识,知道什么是 UDP了。 跟着视频学啊学,反复看,做出来了第一个小例子。贴上代码,上面有我的注释,清晰的标明了整个过程的来龙去脉。稍后我学完整个网络编程技术的所有视频后我再贴上来我整理的一些资料。这里先记录下第一个小例子。 // 发送类 class SendMsg implements Runnable { private DatagramSo

1484

java socket网络编程(多线程技术)

Client.java import java.io.*; import java.net.*; import java.util.*; public class Client { public static void main(String args[]) { Scanner scanner = new Scanner(System.in); ...

weixin_30502965的博客 115

Delphi之TServerSocket和TClientSocket多线程传输示例:助您掌握Delphi网络编程核心技术

Delphi之TServerSocket和TClientSocket多线程传输示例:助您掌握Delphi网络编程核心技术 去发现同类优质开源项目:https://gitcode.com/ 在众多编程语言中,Delphi以出色的性能和强大的功能著称。今天,我们就来为大家介绍一个开源项目——Delphi之TServerSocket和TClientSocket多线程传输示例,该项目将帮助您快速掌握Del...

gitblog_06754的博客 745

多线程技术

网络编程——多线程技术 多线程共存于应用程序中是现代操作系统中的基本特征和重要标志。为了提高程序的运行效率,在操作系统中提出了进程和线程的概念,在一个进程中可以包含多个线程,进程作为资源分配的基本单位,线程作为独立运行和独立调度的基本单位。既然提到了进程和线程,就涉及到进程(线程)的并发执行以及互斥对象的访问。这些在网络编程中都是十分重要的知识点。具体操...

weixin_34019929的博客 63
上一篇: 网络编程——字符界面的网络聊天程序
下一篇: 网络编程——线程同步和线程死锁
HeartHelp2013
博客等级 码龄13年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值