完成端口(IOCP) 也可以这样用~~呵呵~ 用来充当线程之间的数据队列~

// 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;
}

时间: 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.我们在请求到来后,将得到的数据打