完成端口(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;
}


目录
相关文章
|
Java 索引
多线程向设备发送数据
多线程向设备发送数据
227 0
|
消息中间件 监控 安全
服务Down机了,线程池中的数据如何保证不丢失?
在分布式系统与高并发应用开发中,服务的稳定性和数据的持久性是两个至关重要的考量点。当服务遭遇Down机时,如何确保线程池中处理的数据不丢失,是每一位开发者都需要深入思考的问题。以下,我将从几个关键方面分享如何在这种情况下保障数据的安全与完整性。
473 2
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
消息中间件 监控 Java
线程池关闭时未完成的任务如何保证数据的一致性?
保证线程池关闭时未完成任务的数据一致性需要综合运用多种方法和机制。通过备份与恢复、事务管理、任务状态记录与恢复、数据同步与协调、错误处理与补偿、监控与预警等手段的结合,以及结合具体业务场景进行分析和制定策略,能够最大程度地确保数据的一致性,保障系统的稳定运行和业务的顺利开展。同时,不断地优化和改进这些方法和机制,也是提高系统性能和可靠性的重要途径。
481 62
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
513 57
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
缓存 安全 Java
面试中的难题:线程异步执行后如何共享数据?
本文通过一个面试故事,详细讲解了Java中线程内部开启异步操作后如何安全地共享数据。介绍了异步操作的基本概念及常见实现方式(如CompletableFuture、ExecutorService),并重点探讨了volatile关键字、CountDownLatch和CompletableFuture等工具在线程间数据共享中的应用,帮助读者理解线程安全和内存可见性问题。通过这些方法,可以有效解决多线程环境下的数据共享挑战,提升编程效率和代码健壮性。
545 6
|
存储 监控 Java
JAVA线程池有哪些队列? 以及它们的适用场景案例
不同的线程池队列有着各自的特点和适用场景,在实际使用线程池时,需要根据具体的业务需求、系统资源状况以及对任务执行顺序、响应时间等方面的要求,合理选择相应的队列来构建线程池,以实现高效的任务处理。
1117 12
|
数据采集 存储 安全
Python爬虫实战:利用短效代理IP爬取京东母婴纸尿裤数据,多线程池并行处理方案详解
本文分享了一套结合青果网络短效代理IP和多线程池技术的电商数据爬取方案,针对京东母婴纸尿裤类目商品信息进行高效采集。通过动态代理IP规避访问限制,利用多线程提升抓取效率,同时确保数据采集的安全性和合法性。方案详细介绍了爬虫开发步骤、网页结构分析及代码实现,适用于大规模电商数据采集场景。