使用 Winsock Extension API 的正确姿势
所谓的 Winsock Extension API 指的是微软专门额外添加,由应用层 mswsock.dll 导出的函数集,包括 AcceptEx()
, DisconnectEx()
.etc
使用这部分 API 的原因是它们通常支持更新更牛X的特性,且几乎大多数都是异步函数。
所谓的 Winsock Extension API 指的是微软专门额外添加,由应用层 mswsock.dll 导出的函数集,包括 AcceptEx()
, DisconnectEx()
.etc
使用这部分 API 的原因是它们通常支持更新更牛X的特性,且几乎大多数都是异步函数。
如果应用程序存在多个模块,那么有很大的可能通过 SetUnhandledException()
安装的崩溃处理函数和发生崩溃的地址不在一个模块内,因此直接在 crash handler 里使用当前模块地址是错误的做法。
一个可行的方法是,利用崩溃时的上下文信息 EXCEPTION_POINTERS
,拿到触发崩溃的地址 EIP/RIP,然后利用 Windows 7 新增的 GetMappedFileNameW()
拿到某个地址所在的模块的完整设备路径。
根据标准文档的要求,std::atomic_flag
只有利用 ATOMIC_FLAG_INIT
初始化之后,才获得一个确定的初始状态。
现在假设我们要自己实现一个 spin-lock,那么只需要利用 std::atomic_flag
实现一个 spin-mutex:
有时候需要在 C++ 里用 enum (class)
表示 flags,进行基础的 bitwise 运算,而哪怕是支持自动到 underlying integer 转换的 traditional enum,也需要额外的 cast 才能实现,所以在需要的时候为 enum
添加位运算支持还是有一定市场的。