// Test32.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdlib.h>
#include <windows.h>
#include <process.h>
#include <iostream>
HANDLE m_hCompletionPort;
volatile BOOL m_bShutDown;
struct TESTOVERLAPPED
{
OVERLAPPED m_ol;
CHAR szData[512];
};
UINT WINAPI IOWorkerThreadProc(LPVOID pParam)
{
BOOL bError = FALSE;
DWORD dwIoSize = 0;
DWORD dwCmpKey = 0;
LPOVERLAPPED lpOverlapped = NULL;
TESTOVERLAPPED* pOverlapBuff = NULL;
while ( !bError )
{
pOverlapBuff = NULL;
dwCmpKey = 0;
// Get a completed IO request.
BOOL bIORet = GetQueuedCompletionStatus(m_hCompletionPort, &dwIoSize, (LPDWORD) &dwCmpKey, &lpOverlapped, INFINITE);
// Simulate workload (for debugging, to find possible reordering)
//Sleep(20);
// If Something whent wrong..
if (!bIORet)
{
DWORD dwIOError = GetLastError();
if(dwIOError != WAIT_TIMEOUT) // It was not an Time out event we wait for ever (INFINITE)
{
continue;
}
}// if (!bIORet)
if(bIORet && lpOverlapped && dwCmpKey)
{
pOverlapBuff=CONTAINING_RECORD(lpOverlapped, TESTOVERLAPPED, m_ol);
if(pOverlapBuff!=NULL)
{
//pThis->ProcessIOMessage(pOverlapBuff, dwCmpKey, dwIoSize);
printf("ThreaId:0x%x %d %s ",GetCurrentThreadId(),dwCmpKey,pOverlapBuff->szData);
}
delete pOverlapBuff;
}
if((dwCmpKey == NULL) && (pOverlapBuff == NULL) && m_bShutDown)
{
bError = TRUE;
}
}
printf("Thread dead!");
return 0xdead;
}
int _tmain(int argc, _TCHAR* argv[])
{
m_hCompletionPort = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, 0 );
uintptr_t hThread =_beginthreadex(0,0,IOWorkerThreadProc, 0,0, NULL);
hThread =_beginthreadex(0,0,IOWorkerThreadProc, 0,0, NULL);
hThread =_beginthreadex(0,0,IOWorkerThreadProc, 0,0, NULL);
m_bShutDown = FALSE;
for(int i = 0; i < 30; i++)
{
DWORD dwCmpKey = i;
TESTOVERLAPPED * pOverlapBuff = new TESTOVERLAPPED;
memset(pOverlapBuff->szData,0,sizeof(pOverlapBuff->szData));
sprintf(pOverlapBuff->szData,"CMD ID:%d",i);
PostQueuedCompletionStatus(m_hCompletionPort, 0, (ULONG_PTR) &dwCmpKey, &pOverlapBuff->m_ol);
}
m_bShutDown = TRUE;
PostQueuedCompletionStatus(m_hCompletionPort,0,0,0);
getchar();
return 0;
}
完成端口(IOCP) 也可以这样用~~呵呵~ 用来充当线程之间的数据队列~
时间: 2024-09-30 18:14:05
完成端口(IOCP) 也可以这样用~~呵呵~ 用来充当线程之间的数据队列~的相关文章
TCP/IP中3688端口是什么?
翻译的不好将就看吧. 一个软件端口(通常只是被称为一个"口")是一个虚拟的数据连接,可以通过程序用于直接交换数据,而不是通过文件或其他临时存储位置.其中最常见的是TCP和UDP端口,这是用来在互联网上的计算机之间的数据交换. 3688/udp端口使用服务类型简单的推- S- S简单的推协议.一个畸形的请求端口3688/udp已知会导致拒绝服务攻击. 在计算机网络中使用的TCP和UDP协议,端口是一个特殊的数字,目前在一个数据包的头.端口通常用于数据映射到一个特定的计算机上运行的过程
如何提高并发处理速度?
问题描述 2000个用户同时进行TCP连接,500毫秒发送一次数据,每个数据包1k左右.我使用完成端口接收数据,然后插入到一个Queue中,这个Queue使用lock同步,开40个处理线程将数据从Queue中取出后进行处理.现在完成端口接收数据没有问题,但处理数据的速度跟不上,导致内存不断增加,最后把机器给拖死了.我分析应该是Queue操作占用了时间,本想多处理开线程,但担心开太多线程线程间切换会导致效率降低,请各位大侠给支个招! 解决方案 解决方案二:要看你的'处理'的特点是什么.如果是计算为
Java并发编程【1.2时代】
本文介绍了Java原生的多线程技术(1.2),通过详细介绍wait和notify相关的机制.基础的多线程技术以及基于这些技术的等待超时.线程间的通信技术和线程池高阶技术,最后通过一个基于线程池的简单文本web服务器-MollyServer,来阐明多线程带来好处.通过介绍这些技术,展示了在没有使用Java并发包的时代(1.5-)是如何完成Java的多线程编程,为理解Java5提供了良好帮助. 线程简介 Java从诞生开始就明智的选择内置对多线程的支持,这将Java语言同其他同
进程与线程---Python_Daily
进程和线程 在操作系统看来,一个任务就是一个进程,而一个进程内部如果要做多个任务就是有多个线程.一个进程至少有一个线程. 真正的并行执行任务是由多个CUP分别执行任务,实际中是由,操作系统轮流让各个任务交替执行,任务1执行0.01秒,任务2执行0.01秒,之后再依次切换. Python中支持两种模式: 多进程模式 多线程模式 多进程 Linux操作系统下,提供了一个fork()系统调用.调用一次fork(),返回两次,因为操作系统自动把当前的进程(作为父进程)复制了一份(称为子进程),然后子
java之JUC系列-外部Tools-Executors|Semaphor|Exchanger|CyclicBarrier|CountDownLatch
前面写了两篇JDBC源码的文章,自己都觉得有点枯燥,先插一段JUC系列的文章来换换胃口,前面有文章大概介绍过J U C包含的东西,JUC体系包含的内容也是非常的多,不是一两句可以说清楚的,我这首先列出将会列举的JUC相关的内容,然后介绍本文的版本:Tools部分 J.U.C体系的主要大板块包含内容,如下图所示: 注意这个里面每个部分都包含很多的类和处理器,而且是相互包含,相互引用的,相互实现的. 说到J UC其实就是说java的多线程等和锁,前面说过一些状态转换,中断等,我们今天来用它的tool
Python3.6学习笔记(四)
错误.调试和测试 程序运行中,可能会遇到BUG.用户输入异常数据以及其它环境的异常,这些都需要程序猿进行处理.Python提供了一套内置的异常处理机制,供程序猿使用,同时PDB提供了调试代码的功能,除此之外,程序猿还应该掌握测试的编写,确保程序的运行符合预期. 错误处理 在一般程序处理中,可以对函数的返回值进行检查,是否返回了约定的错误码.例如系统程序调用的错误码一般都是-1,成功返回0.但是这种方式必须用大量的代码来判断是否出错,所以高级语言内置了try...except...finally的
在c#使用IOCP(完成端口)的简单示例
这次给大家演示一下利用IOCP的在线程间传递数据的例子,顺便打算讲一些细节和注意的地方. 概述:这里主要使用IOCP的三个API,CreateIoCompletionPort,PostQueuedCompletionStatus,GetQueuedCompletionStatus,第一个是用来创建一个完成端口对象,第二个是向一个端口发送数据,第三个是接受数据,基本上用着三个函数,就可以写一个使用IOCP的简单示例. 其中完成端口一个内核对象,所以创建的时候会耗费性能,CPU得切换到内核模式,而且
在c#使用Windows IOCP(完成端口)编程研究
在c#使用Windows IOCP(完成端口)编程研究 一:概述 (1)IOCP是什么呢? 它就是Io Completion Port的缩写,它就是MS的内核调用机制. 因为在硬件里,与驱动程序打交道都是通过协议栈进行的,并且是通过发送包请求实现. 当在网络服务器使用它实现时,就会最接近内核部份,提高了性能,也提高速度. 目前就要看看怎么样用IOCP创建高性能的服务器,怎么样响应大量用户的TCP,或者UDP的数据. 当创建IOCP端口后,就要初始化连接监听,这跟一般
[C#]I/O完成端口的类定义和测试实例
从William Kennedy那里整理过来的,不同之处在于他自己定义了一个Overlapped,而我们这里直接使用 System.Threading.NativeOverlapped.附一段我以前的Win32下的IOCP文档,如果您了解IOCP也可以直接跳过看后面的C#测试示范: 整理者:郑昀@UltraPower 我们采用的是I/O Complete Port(以下简称IOCP)处理机制. 简单的讲,当服务应用程序初始化时,它应该先创建一个I/O CP.我们在请求到来后,将得到的数据打