S

Skywind Inside

写自己的代码,让别人猜去吧

GCC 利用未定义行为进行优化正确么?

说实话,编译器是否该利用 Undefined Behavior 进行优化目前都还是一个争议话题,主要是 gcc 开了个坏头,不予余力的在默认参数下利用 UB 来优化,举个例子,C 语言里带符号整数溢出是未定义行为,编译器应该假设它实际上以某种方式定义了: int foo(unsigned char c) { int value = 2147483600; value += c; if (value < 2147483600) bar(); return value; } 但利用这个 UB 进行优化的编译器会认为,既然 x 不会是负数,那么 value < 2147483600 就永远不会发生,所以整个 if 语句以及后面的 … Continue reading → The post GCC 利用未定义行为进行优化正确么? appeared first on Skywind Inside.

2025/1/19
articleCard.readMore

异步事件模型的 Self-pipe trick

异步事件模型中有一个重要问题是,当你的 select/poll 循环陷入等待时,没有办法被另外一个线程被唤醒,这导致了一系列问题: 1)在没有 pselect/ppoll 的系统上,信号无法中断 select/poll 等待,得不到即时处理; 2)另一个线程投递过来的消息,由于 select/poll 等待,无法得到即时处理; 3)调短 select/poll 的超时时间也无济于事,poll 的超时精度最低 1ms,粗糙的程序可能影响不大,但精细的程序却很难接受这个超时; 4)有的系统上即便你传了 1ms 进去,可能会等待出 15ms 也很正常。 比如主线程告诉网络线程要发送一个数据,网络线程还在 select/poll 那里空等待,根本没有机会知道自己自己的消息队列里来了新消息;或者多个 select/poll 循环放在不同线程里,当一个 accept 了一个新连接想转移给另一个时,没有办法通知另一个醒来即时处理。 解决这个问题的方法就叫做 self-pipe trick,顾名思义,就是创建一个匿名管道,或者 socketpair,把它加入 select/poll 中,然后另外一个线程想要唤醒它的话,就是往这个管道或者 socketpair 里写一个字节就行了。 类似 java 的 nio … Continue reading → The post 异步事件模型的 Self-pipe trick appeared first on Skywind Inside.

2024/11/4
articleCard.readMore

WinSock 可以把 SOCKET 类型转换成 int 保存么?

在 Linux/Unix 等 posix 环境中,每个套接字都是一个文件描述符 fd,类型是 int,使用起来非常方便;但在 Win32 环境中是 SOCKET 类型被定义成 UINT_PTR ,是一个指针,在 x64 环境中一个 SOCKET 占用 8 个字节。 那么是否能将 SOCKET 类型强制转换成 int 类型保存没?这样就能统一用 int 在所有平台下表示套接字了,同时在 x64 环境下这样将 64 位的指针转换为 32 位的整数是否安全? 答案是可以的,下面将从三个方面说明一下。 Kernel Object 每个 SOCKET 背后其实都是一个指向 Kernel Object … Continue reading → The post WinSock 可以把 SOCKET 类型转换成 int 保存么? appeared first on Skywind Inside.

2024/11/1
articleCard.readMore

WinSock 的 select 如何超过 64 个套接字限制?(三种方法)

在做跨平台网络编程时,Windows 下面能够对应 epoll/kevent 这类 reactor 事件模型的 API 只有一个 select,但是却有数量限制,一次传入 select 的 socket 数量不能超过 FD_SETSIZE 个,而这个值是 64。 所以 java 里的 nio 的 select 在 Windows 也有同样的数量限制,很多移植 Windows 的服务程序,用了 reactor 模型的大多有这样一个限制,让人觉得 Windows 下的服务程序性能很弱。 那么这个数量限制对开发一个高并发的服务器显然是不够的,我们是否有办法突破这个限制呢?而 cygwin 这类用 Win32 API 模拟 posix API 的系统,又是如何模拟不受限制的 … Continue reading → The post WinSock 的 select 如何超过 64 个套接字限制?(三种方法) appeared first on Skywind Inside.

2024/10/31
articleCard.readMore

DOS 经典软件下载

二十多年前的某一天,我盯着资源管理器里很久没用却一直舍不得删除的 UCDOS 文件夹犹豫了半天,最终却为了给硬盘腾点空间一狠心 shift+delete 把他们彻底删除了,当时我没意识到,一个时代就这样彻底的离我远去;二十多年后的今天,我又在最新版的 DOSBOX 里把这些当年的工具一个个重新装了回去,软件没变,但是消逝的青春却再也回不来了。 做了一个《上古软件仓》,包含上古时代的编程工具,汉字系统和设计软件等,都是一些我以前经常用的软件,主打怀旧和娱乐。 截图:中文系统 (点击 more/continue 继续) 截图:WPS 截图:整人专家 2000 其它工具包括: CCED,Borland C++,Watcom C++,Turbo C,QBasic,FoxBase,sea 1.3 等。 欢迎访问: https://skywind.me/wiki/%E4%B8%8A%E5%8F%A4%E8%BD%AF%E4%BB%B6%E4%BB%93 The post DOS 经典软件下载 appeared first on Skywind Inside.

2024/10/16
articleCard.readMore