- 博客(174)
- 资源 (25)
- 论坛 (1)
- 收藏
- 关注

原创 关于AcceptEx
最基础的IOCP例子, 没有使用扩展函数AcceptEx: IOCP模型* 关于iocp的核心就一点:GetQueuedCompletionStatus 将携带返回2个重要的参数, 一个lpCompletionKey, 一个lpOverlapped.lpCompletionKey : 是 CreateIoCompletionPort((HANDLE)clientSocket , ...
2019-09-20 00:21:19
342

原创 线程安全 可重入
昨天有人问可重入和线程安全, 实际是混在一起淘浆糊了;这2个是完全不同的概念;可重入函数只有在signal下会发生, 比如一个函数在执行时被中断, 在中断处理函数中又一次被调用,这2次(每次)调用都能产生正确的结果,那就个可重入函数;看一个不可重入的例子:void sig_handler(int sig){ ... gethostbyname("www...
2019-07-08 03:42:35
384

原创 一个例子说明volatile
之前一个例子 :另人厌烦的线程安全单例以及不要使用双检测说到了volatile ,volatile本身跟线程没关系, 他只做了一件事:每次读取此变量时,都到内存中去读, 让编译器别优化.gcc -O 进行优化后, 自动变量(int a) 一般情况下都可能被存放在寄存器中;下面代码用回滚操作来说明 volatile 的作用:#include "util.h"#include ...
2019-07-07 14:27:00
121

原创 EPOLL IOCP OVERLAPPED NONBLOCK的一些说明
最简单的多线程 , 多进程最简单的多进程/多线程服务器代码都是用 一个线程 / 一个进程 来接受/发送数据 , 资源消耗太大,不合算; 相当于一对一 [ 一个老师管理一个学生的样子 ];因此有了 select / poll / epoll / iocp 模型 .select / poll 把多个socket交给一个数组来管理 ,epoll 把每个个socket 所关联的事件统一...
2019-07-07 04:07:30
129

原创 EPOLLOUT例子 EPOLLOUT触发条件
下面的代码都在ET下工作群里小伙伴没搞懂EPOLLOUT 再写2个例子; 2个例子都是回声服务器代码;关于EPOLLET的基础 , 以及EPOLLIN|EPOLLOUT|EPOLLET 一起注册的例子:EPOLLET简单例子下面2个例子都是关于EPOLLOUT,第一个例子利用EPOLL_CTL_MOD来触发EPOLLOUT,这种方式不太好,需要利用一次系统调用epoll_w...
2019-07-05 03:01:43
3974
1

原创 边缘模式EPOLLET EPOLLOUT简单例子
给群里写的,简单的EPOLLET 例子:EPOLLOUT详细说明下面2个服务器例子 ,一个没有处理EPOLLOUT, 另一个处理了;第一个例子只用来展示EPOLLET 的特点第2个例子是一个echo服务器, 处理了EPOLLOUT,如果要看EPOLLOUT的直接往下拉到第个例子, 主要还是看 errno == EAGAIN 这些地方在ET模式下:对于EPOLLIN...
2019-07-01 20:17:43
705

原创 就给人写了个内存池
写了一个简单的内存池; 主要用于需要不断的创建和销毁对象已经重载了new/delete;基本使用就3个接口1. MemMgr::alloc 分配内存 (new 调用这个)2.MemMgr::dealloc 释放 (delete调用这个)3. MemMgr::createpool 创建内存池 ; 唯一需要额外调用的函数基本思想就是在每个内存块前加一个MemBlock用于管理...
2019-06-21 18:38:53
95

原创 因多线程引起的new关键字说明
在线程安全单例以及不要使用双检测说了new产了3个步骤;分配内存 调用构造函数 把地址返回2 和 3 由编译器来完成;有的小伙伴不太懂,说明一下;先给结论:使用关键字(new,delete)和直接调用全局函数(operator new / delete ) 不一样的 , 编译器会做额外的事new关键字调用 先::operator new 分配空间 - >...
2019-06-19 01:05:10
408

原创 简易win32线程池实现
线程池大致情况: 下面的代码没用c++封装,可自行封装,只提供了3个函数 :创建 , 添加任务, 停止并销毁线程池;思路:先起N个线程 ( _beginthreadex / pthread_create) ,问题是用什么办法先让这些线程暂停 , 并且让这些线程得到通知后再执行某个函数呢?下面的实现是用条件变量, 每次调用添加任务就发送一个信号 , 一旦某个线程抢占到 去某个[ 队...
2019-06-05 18:59:13
259

原创 twisted 以及相关源码
官方文档不怎么友好..哈哈哈自己写了个总体按照:https://twistedmatrix.com/documents/current/core/howto/servers.html来写twisted总体就是一个循环. 下面我会按照 socket编程 的习惯来说明第一个例子: 里面有2个类说简单说明一下:1. Protocol 类, 内部封装了一个 transport ...
2019-02-26 02:51:52
288

原创 scrapy Spider CrawlSpider redis 总汇以及一些源码分析
scrapy 流程图 玩scrapy 时,一直看着这张图就ok.scrapy需要的基础 : lxml ( xpath) , 关键字 yield ( 生成器) . 生成器我的博客中有很多文章.可以自己去找 . 下面先说一下scrapy的全貌:一个最简单的Spider : 基本上你用scrapy创建的跟我的差不多.class ChoutiSpider(scrapy.Spi...
2019-02-19 18:27:00
660

原创 gevent gevent.queue gevent读取文件
gevent 一种异步的方式,基于事件循环.. 跟 asyncio 里的东西运作的差不多官方手册说的太不清楚 . 自己写了个入门教程.一个最简单的例子:spawn 将把你的函数封装成一个个协程对象 # 注意. gevent.sleep 不是 time.sleep . 下一个例子说明def fuck1(arg): print('我在这: ',fuck1.__...
2019-01-30 03:33:38
733

原创 IOCP 完成端口服务器模型
IOCP 的前身 :纯重叠io服务器模型前提:IOCP的整体编程模型跟上面的纯重叠io 非常类似. 纯重叠io使用OVERLAPPED + APC函数完成.这种模型的缺点是必须让调用apc函数进入alterable状态. 而IOCP解决了这个问题.IOCP让我们自己创建一些线程,然后调用GetQueuedCompletionStatus 来告诉我们某个io操作完成, 就像...
2019-01-17 17:12:42
179

原创 纯重叠io服务器模型
基础:套接字重叠io客户端: telnet 或者自己随意写一个;纯重叠实现的服务器模型,基本上就是使用OVERLAPPED和APC函数完成.APC函数即需要使用alterable状态的函数 , 例 SleepEx.另外重叠io与非阻塞是2个概念.下面的代码中使用到了非阻塞io, 仅仅作用在了accept上. 让其不阻塞;原因是如果阻塞accpet 就没法调用到Slee...
2019-01-15 17:32:18
229
1

原创 套接字socket重叠io
编写模型基本与本地重叠io一致 .本地OVERLAPPED另:重叠io 并非是 非阻塞io,两者是不同的概念重叠io是让操作系统帮忙在后台运行, win上的OVERLAPPED , linux上的 aio 系列函数,他们告诉你何时完成非阻塞io是自己判断何时操作完成(例如WSAEWOULDBLOCK , EAGAIN), 比如EPOLL的ET模式:epoll select的限制 条...
2019-01-14 20:38:27
435

原创 异步io通知 WSAEventSelect
WSAEventSelect 就是 select的增强版;注意WSAEventSelect 是通知异步, 而不是传送数据异步;总的来说就是一个异步的阻塞模型; 如果要与 select 做个比较的话 :select 在 需要进行或者可以进行io处理时 返回. 而WSAEventSelect 在返回时(WSAWaitForMultipleEvents) 与io状态无关;例如: ...
2018-12-28 18:29:37
166

原创 epoll select的限制 条件触发 边缘触发
结论: epoll 要优于 select ,纯粹个人测试结果. 编程模型基本一致题外话:在io复用中把监听套接字设为非阻塞EPOLL描述以及EPOLLOUT处理EPOLLOUT详细例子下面代码中的epoll是最简单的实现, 一般情况都会自定义结构体赋值给 event.data.ptr,同时注意如果在使用边缘(ET)触发时给监听socket设置EPOLLET ,...
2018-12-26 12:39:47
378

原创 多个缓冲区
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <semaphore.h>#include <pthread.h>#includ
2018-12-01 03:04:19
307

原创 完成端口读取文件
完成端口首先得了解什么是重叠io OVERLAPPED I/O 异步APC下面的例子只告诉你怎么写这个程序, 不是告诉你理论,即如果在服务器上为什么不使用一个线程一个客户的模型CreateIoCompletionPort 创建一个完成端口. 这个函数有一般需要调用2次 第一次:HANDLE iocp = CreateIoCompletionPort(INVALID_HANDL...
2018-10-31 18:13:22
666

原创 多缓冲区读写文件
使用 OVERLAPPED 来读写大文件还错,如果是小文件性能不是特别好 , 这个仅仅是自己电脑的测试.用多缓冲区来读写会比较快 一个例子:const int __BUFFSIZE = 8192; //存放大小const int __LEN = 10; //10个缓冲区struct{ struct{ ...
2018-10-30 21:34:34
240

原创 OVERLAPPED I/O 异步APC
APC简介:APC附: 套接字中的WSAOVERLAPPED 和 OVERLAPPED 是一个东西. OVERLAPPED 中的InternalHigh 用于显示当前读取了多少字节. Internal 用于显示错误信息, 0 即无错误;GetOverlappedResult 返回的字节以及错误都是根据 OVERLAPPED 结构中的字段来提取的.这也是为什么GetOverl...
2018-10-30 16:57:29
1074
原创 日志 多线程 自动刷新 _fwrite_nolock
只启动了一个线程 用来写日志.性能方面没问题, 支持多线程写入.每3秒自动查看缓冲区是否有数据,有就写入 .或者外部N个线程同时写满一块缓冲区,进行写入.主要是减少少量数据[几个字节]就写入一次的次数.写入方面可以用 WriteFile 或者_fwrite_nolock. 如果用用WriteFile 还可以使用APC来通知,目前没此需求另外,写入出错方面,只是简单的打印,可自行修改的完善一些如果没有别的需求,直接使用Log类即可Log : start() 启动, s...
2020-07-28 23:29:30
73
原创 win32 定时器 CreateThreadpoolTimer CreateTimerQueueTimer
linux 下可以使用timerfd_create 一系列函数win32下CreateThreadpoolTimer 或者CreateTimerQueueTimer 都可以用进程默认的线程池来使用回调对于DeleteTimerQueueTimer 以及DeleteTimerQueueEx 最后一个参数需要注意一下如果是 INVALID_HANDLE_VALUE : callback如果正在调用则等待回调完成如果是 NULL : callback 如果正在调用,则G...
2020-07-27 23:33:24
132
原创 德州扑克
一个快速计算德州扑克牌型的方法.只有生成图那个地方是关键, 看懂了就全懂了在车上写的, 只写了 同花和 顺子, 似乎没什么问题牌用16进制表示 , 高4位 是颜色位, 低4位是数值位/* 黑桃从 0x02开始, 红心从 0x12 开始 16进制的高位 表示颜色 , 低位表示牌值*/enum CardColor{ enum_spade ...
2020-03-29 21:56:29
148
原创 安全随机数
随机数出问题了, 分装了一个#include <Wincrypt.h>#include <Realtimeapiset.h>#include <tchar.h>#pragma comment(lib,"Advapi32.lib")class CryptRandom{ CRITICAL_SECTION __lock; HCRYP...
2020-03-20 21:50:41
134
原创 安全随机数
int GetRandBytes(void * const buffer, const int iLen){ if(NULL == buffer || 0 == iLen ) return -1; HCRYPTPROV hProvider = 0; DWORD dwRes =::CryptAcquireContext(&hProvider, 0,...
2020-03-20 01:33:48
81
原创 js Promise
一句话: promise 用来管理异步调用用 Promise.then 处理异步调用的返回结果, 无非成功、失败;-------------->>>>>>>>> Promise 的作用是状态的传递; <<<<<<<<<<<--------------------...
2020-03-13 01:34:44
53
原创 eventfd
eventfd : 一个计数器,类似信号量;eventfd 一般用于多线程,多进程,epoll返回一个fd , 可读写;write函数用于给计数器累加数值, 例如: // 计数器初始化 : 0 int _eventfd = eventfd(0,EFD_CLOEXEC); uint64_t t =2;// 写入一个2, 则此时 计数器+= 2 ...
2019-11-18 01:23:51
155
原创 epoll Reactor 与 iocp 模型
epoll reactor : 能收了告知我 !iocp : 最多给我收wsabuf.len个字节, 收完告诉我!
2019-11-06 23:25:01
133
原创 atomic 内存序
提高性能的一种方式atomic 替换mutex内存序跟原子操作本身并不冲突, 不论用那种内存序该原子还是原子操作atomic内存序: 就是来指定顺序的例子:注 : 像类似 memory_order_relaxed 都是以函数为单位来重新排执行指令的 [这个注释后面再来看好了]#include <atomic>atomic<int> a (0);...
2019-11-01 03:12:06
233
原创 c++ atomic 替换锁
有些文不对题了;最近搞线程池并发过程中突然想起来用 原子类型 来替换一些mutex, rwlock, cond这些东西;比如一个reactor 的epoll+线程池[ 例如4个 ], 在发送数据时为了保证tcp socket的数据顺序,必须加锁处理 [这种模型不容易控制, 实际工程中别用, 对于 socket 还是有一个线程来处理最简单也避免竞争问题].然后我发现了个好东西;...
2019-10-31 01:04:17
437
原创 花花公子 243线SLOT
另一种243线的SLOT游戏3*5的数组具体思路, 每个数组元素根据14个图案的概率去随机获取,如果无法获取到则先赋值-1, 最后把-1的元素全部替换成无法赢钱的图案,这些图案中不能包含WILD和SCATTER,我这的代码里概率设置的很低#include <random>#define RATELEN 15#define ROW 3#define LINE...
2019-10-11 01:10:19
161
原创 花花公子
一个3*5的矩阵至少连续3个列都出现同一个卡牌算赢, 无视位置比如:1 0 0 0 00 1 0 0 00 0 1 0 0思路: 先计算所有不算位置 , 而能赢的全排列数据#define Row 3#define Line 5int main(int argc, char* argv[]){ using namespace std; ...
2019-09-26 01:26:39
1483
原创 多线程记录二进制流文件
一个生产者多消费者的应用 , 代码里目前就先简单用了单生成单消费,每一局麻将都需要记录:每一次的发牌,抓牌,出牌 ,吃碰杠胡听;把所有的牌 序列化成二进制存入文件每一局麻将生成一个key , 可随意自己组合下面代码思路仅供参考, 还未测试过; 可修改成多线程日志主线程唯一需要在开始的时候调用一次 start , 记录用push;2种模式可选, 一种不关闭文件han...
2019-09-07 16:28:57
65
原创 c++ 胡牌 听牌
生成一张N维的图去分析, 比较容易一些这个是2人麻将, 4人麻将改几个数值就可以用了;判断胡牌的思路:比如 :1~9万, 0x01 ~ 0x09 ;1~9筒 , 0x11~0x19;1~9条 , 0x21~ 0x29;东南西北中发白 : 0x31 ~ 0x39花牌 : 0x41 ~ 0x48;弄一个 arr[4][10] 的数组, 做一个牌型的图出来...
2019-08-31 16:44:46
102
原创 老虎机 抽奖 概率
适用于任何需要概率的游戏; 没几行代码;主要是生成一个概率数组 , 接下去每次随机一个数, 去这个数组里选取对应的值#include <random>//从概率数组中 拿个索引, 对应概率数组int get_rate_index(long double * arr,int len ,long double rand_num){ for(int i = 0 ...
2019-08-22 23:37:57
907
原创 从数组中任取N个数重新生成全排列N维数组
代码只给出一个思路, 都写注释里了, 可以根据需求生成N维数组的各种位置的全排列数组;比如 [1,2,3] 来生成一个3*3的全排列数组;下面生成了一个 3* 3的数组 , 用于各种位置的变化,如果需要更多维度的不同位置的全排列数组, 继续增加 do while 来全排列即可;#include <iostream>#include <algor...
2019-08-22 22:35:35
108
原创 基于多线程的EventSelect
单线程的:异步io通知 WSAEventSelect单线程上最多只能接受64个event;改版多线程的 , 大概思路:1. 主线程就接受一个监听套接字, accept返回的socket 仍到全局队列中2. 一个分配socket的线程 用于控制 socket 分配到哪个 监听事件的线程中去 [ dispath thread] ;3. 创建一个线程池 默认4个线程, 每个线程分别...
2019-08-13 17:50:35
86
原创 numpy pil 4行代码修改图片颜色 倒置 马赛克
群里的人问怎么改图片颜色.numpy + PIL 实现;主要还是用了numpy中的切片, 和指定元素顺序功能比如:kk =[[[1,2,3],[4,5,6]],[[10,9,8],[7,8,9]]]d = np.array(kk)print(d)print("-" * 10)print(d[:,:,[2,0,1]]) #[2,0,1] -> 把原来的0,1,2 换个...
2019-07-30 18:38:02
525
原创 jquery 几行代码实现弹幕
<html><head> <title>Title</title> <style type="text/css"> .div_class{ background-color: aqua; width: 800px; height: ...
2019-07-30 04:36:18
108
UNIX环境高级编程
2017-10-21
UNIX网络编程 卷2 进程间通信
2017-10-21
UNIX网络编程卷1
2017-10-21
Python网络编程 Python网络数据采集
2018-06-09
TCP/IP网络编程[韩] 尹圣雨
2018-05-25
Wireshark网络分析的艺术
2017-10-21
libevent参考手册(中文版)
2019-07-06
Effective.C++.中文版(第3版_中文版) 完整书签
2018-11-26
Effective C++ 完整目录
2018-11-26
libevent深入浅出
2019-07-06
UNIX网络编程卷1 完整目录
2018-11-06
Windows核心编程
2017-10-21
数学之美 [美] 吴军
2017-10-12
C语言程序设计-现代方法
2017-10-13
Unix-Linux编程实践教程
2017-10-21
Linux高性能服务器编程
2019-07-06
一道关于getchar与scanf连用的题目如何解
发表于 2012-02-10 最后回复 2012-02-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人 TA的粉丝