Skip to the content.

并发相关的 bug 类型

定位 bug 的方法

code review

测试

多线程测试技术

构建多线程测试代码

void test_concurrent_push_and_pop_on_empty_queue() {
  ConcurrentQueue<int> q;  // 总体设置:先创建一个队列
  std::promise<void> go, push_ready, pop_ready;
  std::shared_future<void> ready(go.get_future());
  std::future<void> push_done;
  std::future<int> pop_done;
  try {
    push_done = std::async(
        std::launch::async,  // 指定异步策略保证每个任务运行在自己的线程上
        [&q, ready, &push_ready]() {
          push_ready.set_value();
          ready.wait();
          q.push(42);  // 线程特定的设置:存入一个 int
        });
    pop_done = std::async(std::launch::async, [&q, ready, &pop_ready]() {
      pop_ready.set_value();
      ready.wait();
      return q.try_pop();
    });
    push_ready.get_future().wait();  // 等待开始测试的通知
    pop_ready.get_future().wait();   // 同上
    go.set_value();                  // 通知开始真正的测试
    push_done.get();                 // 获取结果
    assert(pop_done.get() == 42);    // 获取结果
    assert(q.empty());
  } catch (...) {
    go.set_value();  // 避免空悬指针
    throw;           // 再抛出异常
  }
}

测试多线程代码的性能