diff --git a/test/cpp/qps/client_async.cc b/test/cpp/qps/client_async.cc
index d120a8aaec80e0e3ed35e8e190483a058b28f34e..8c8d927d15fa5355e0cb56872634dc7f190d0bce 100644
--- a/test/cpp/qps/client_async.cc
+++ b/test/cpp/qps/client_async.cc
@@ -168,7 +168,7 @@ class AsyncClient : public Client {
       if (!closed_loop_) {
         rpc_deadlines_.emplace_back();
         next_channel_.push_back(i % channel_count_);
-        issue_allowed_.push_back(true);
+        issue_allowed_.emplace_back(true);
 
         grpc_time next_issue;
         NextIssueTime(i, &next_issue);
@@ -307,11 +307,20 @@ class AsyncClient : public Client {
   }
 
  private:
+  class boolean { // exists only to avoid data-race on vector<bool>
+   public:
+    boolean(): val_(false) {}
+    boolean(bool b): val_(b) {}
+    operator bool() const {return val_;}
+    boolean& operator=(bool b) {val_=b; return *this;}
+   private:
+    bool val_;
+  };
   std::vector<std::unique_ptr<CompletionQueue>> cli_cqs_;
 
   std::vector<deadline_list> rpc_deadlines_;  // per thread deadlines
   std::vector<int> next_channel_;      // per thread round-robin channel ctr
-  std::vector<bool> issue_allowed_;    // may this thread attempt to issue
+  std::vector<boolean> issue_allowed_; // may this thread attempt to issue
   std::vector<grpc_time> next_issue_;  // when should it issue?
 
   std::vector<std::mutex> channel_lock_;