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

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

// 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月前
|
消息中间件 监控 安全
服务Down机了,线程池中的数据如何保证不丢失?
在分布式系统与高并发应用开发中,服务的稳定性和数据的持久性是两个至关重要的考量点。当服务遭遇Down机时,如何确保线程池中处理的数据不丢失,是每一位开发者都需要深入思考的问题。以下,我将从几个关键方面分享如何在这种情况下保障数据的安全与完整性。
60 2
|
19天前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
32 2
|
6月前
|
消息中间件 Java Kafka
实时计算 Flink版操作报错之Apache Flink中的SplitFetcher线程在读取数据时遇到了未预期的情况,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
2月前
|
消息中间件 存储 Java
服务重启了,如何保证线程池中的数据不丢失?
【8月更文挑战第30天】为确保服务重启时线程池数据不丢失,可采用数据持久化(如数据库或文件存储)、使用可靠的任务队列(如消息队列或分布式任务队列系统)、状态监测与恢复机制,以及分布式锁等方式。这些方法能有效提高系统稳定性和可靠性,需根据具体需求选择合适方案并进行测试优化。
172 5
|
3月前
|
监控 网络协议 Linux
在Linux中,如何实时抓取并显示当前系统中tcp 80 端口的网络数据信息?
在Linux中,如何实时抓取并显示当前系统中tcp 80 端口的网络数据信息?
|
3月前
处理串口线程数据的函数
【8月更文挑战第4天】处理串口线程数据的函数。
26 4
|
3月前
|
传感器 C# 监控
硬件交互新体验:WPF与传感器的完美结合——从初始化串行端口到读取温度数据,一步步教你打造实时监控的智能应用
【8月更文挑战第31天】本文通过详细教程,指导Windows Presentation Foundation (WPF) 开发者如何读取并处理温度传感器数据,增强应用程序的功能性和用户体验。首先,通过`.NET Framework`的`Serial Port`类实现与传感器的串行通信;接着,创建WPF界面显示实时数据;最后,提供示例代码说明如何初始化串行端口及读取数据。无论哪种传感器,只要支持串行通信,均可采用类似方法集成到WPF应用中。适合希望掌握硬件交互技术的WPF开发者参考。
65 0
|
3月前
|
数据处理 Python
解锁Python多线程编程魔法,告别漫长等待!让数据下载如飞,感受科技带来的速度与激情!
【8月更文挑战第22天】Python以简洁的语法和强大的库支持在多个领域大放异彩。尽管存在全局解释器锁(GIL),Python仍提供多线程支持,尤其适用于I/O密集型任务。通过一个多线程下载数据的例子,展示了如何使用`threading`模块创建多线程程序,并与单线程版本进行了性能对比。实验表明,多线程能显著减少总等待时间,但在CPU密集型任务上GIL可能会限制其性能提升。此案例帮助理解Python多线程的优势及其适用场景。
37 0
|
3月前
|
NoSQL Redis
Lettuce的特性和内部实现问题之在同步调用模式下,业务线程是如何拿到结果数据的
Lettuce的特性和内部实现问题之在同步调用模式下,业务线程是如何拿到结果数据的
|
4月前
|
JavaScript
端口,自定义端口,端口写死,Vue如何自定义端口号,这里很关键,因为前后端数据交互,如果在WebConfig中写死了,端口号不对,会导致访问数据失败
端口,自定义端口,端口写死,Vue如何自定义端口号,这里很关键,因为前后端数据交互,如果在WebConfig中写死了,端口号不对,会导致访问数据失败