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

简介: // Test32.cpp : 定义控制台应用程序的入口点。//#include "stdafx.

// 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, 00 );

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


目录
相关文章
|
2月前
|
存储 前端开发 Java
【C++ 多线程 】C++并发编程:精细控制数据打印顺序的策略
【C++ 多线程 】C++并发编程:精细控制数据打印顺序的策略
72 1
|
2月前
|
存储 缓存 Java
9.队列:生产消费模式及线程池的运用
9.队列:生产消费模式及线程池的运用
44 0
|
2月前
|
存储 Java 数据安全/隐私保护
【JUC】ThreadLocal 如何实现数据的线程隔离?
【1月更文挑战第15天】【JUC】ThreadLocal 如何实现数据的线程隔离?ThreadLocal 导致内存泄漏问题?
|
2月前
|
消息中间件 Java Kafka
实时计算 Flink版操作报错之Apache Flink中的SplitFetcher线程在读取数据时遇到了未预期的情况,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
2月前
|
安全
python_threading多线程、queue安全队列
python_threading多线程、queue安全队列
32 2
|
3天前
|
存储 测试技术
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
10 0
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
|
6天前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
18 2
|
6天前
|
Java
synchronized关键字在Java中为多线程编程提供了一种简便的方式来管理并发,防止数据竞争和死锁等问题
Java的`synchronized`关键字确保多线程环境中的数据一致性,通过锁定代码段或方法防止并发冲突。它可修饰方法(整个方法为临界区)或代码块(指定对象锁)。例如,同步方法只允许一个线程执行,同步代码块则更灵活,可锁定特定对象。使用时需谨慎,以避免性能影响和死锁。
10 0
|
2月前
|
设计模式 安全 Java
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
|
2月前
|
关系型数据库 MySQL Java
实时计算 Flink版产品使用合集之同步MySQL数据到Hologres时,配置线程池的大小该考虑哪些
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。

相关实验场景

更多