分类:Tech

共 22 篇文章

同步请求响应的实现

声明:本文代码均为 C++ 伪代码,仅用于表示含义,出于描述简单,语法使用 C++11。

最近在接手的工作中发现了一段有点问题的代码,功能上大致是要实现这样的目标:客户端发送一个请求,然后在当前线程内等待服务器的响应,但由于底层使用的网络库是异步 Reactor 模式的,需要进行一个基本的同步操作来实现发送线程内接收响应。以伪代码的形式表现大概如下:

struct Packet {};

class Synchronizer {};

void SendRequest(Packet *_req)
{
    unsigned int threadId = ::GetCurrentThreadId();
    _req->threadId = threadId;
    network->SendData(target, _req);

    Synchronizer::GetInstance()->RegisterThread(threadId);
    Packet *res = Synchronizer::GetInstance()->WaitThreadData(threadId);
}

显然,WaitThreadData 的操作不能因为收不到对端响应就一直阻塞 ...

阅读全文

内存模型引发的思考

昨天在看《深入理解 Java 虚拟机》,本来以为 12 章讲的内存模型指的是类似 C++ 对象模型的概念,可以在一个半小时内搞定,结果看到硬件上的一致性以及内存模型的概念时就发现触及自己的知识盲区了。

CPU 缓存一致性

首先是 CPU 缓存一致性,借一下书上的图。

现在的 CPU 基本上都是多核了,以 Intel i7 系列的处理器来说,每个核都有各自的寄存器组、L1 Cache、L2 Cache,多个核共享 L3 Cache,这里我们把 L1 和 L2 合起来统称为各个核的高速缓存。显然,各个核之间的高速缓存需要同步,否则如果两个核访问同一块内存时,就可能出现错误,因为它们对该内存的读写操作是直接作用于自己的高速缓存,而非主存,这就引入了 CPU 的缓存一致性协议。

我对这块并没有了解过,在网上搜了一下,找到了一篇感觉还不错的文章:缓存一致性 ...

阅读全文

静态库与动态库的跨编译器兼容

由于当前项目维护的代码需要支持多个编译器,最近突然好奇为什么不直接在高版本的 VS 中直接使用低版本生成的库呢?起初以为是不可行,但是后面从理论上想了一下,感觉对于动态库来说应该可行,低版本生成的 DLL 依赖低版本的 C++ 运行时,高版本生成的可执行程序依赖高版本的 C++ 运行时,按照这样的设定应该没有任何问题才对。

举个例子,VS2013 生成了动态库库 A.lib 和 A.dll,VS2015 中使用了 A.lib 生成 B.exe,让我们来看下最终的依赖情况(下面 C++ 运行时库的名字以 msvc 来代替):

  • B.exe 依赖于 A.dll 和 msvc2015.dll
  • A.dll 依赖于 msvc2013.dll ...
阅读全文