使用 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 添加位运算支持还是有一定市场的。