C++11 如何使用带锁的lambda捕获?

C++11 如何使用带锁的lambda捕获?,c++11,C++11,在下面的代码中,成员变量(match_room_list_)是一个共享资源。所以我使用了互斥 但锁定让我困惑 我是否应该在内部lambda函数中使用lock void room::join_room(int user_id) { std::lock_guard<std::recursive_mutex> lock(mutex_); std::shared_ptr<match_room> find_room = nullptr; for (auto i

在下面的代码中,成员变量(match_room_list_)是一个共享资源。所以我使用了互斥

但锁定让我困惑

我是否应该在内部lambda函数中使用lock

void room::join_room(int user_id) 
{
   std::lock_guard<std::recursive_mutex> lock(mutex_);
   std::shared_ptr<match_room> find_room = nullptr;

   for (auto iter : match_room_list_)
   {
      if (false == iter.second->is_public_room())
      {
            continue;
      }

      if (true == iter.second->is_full())
      {
            continue;
      }

      find_room = iter.second;
      break;
   }

   // Something

   // async ( other thread call this lambda function )
   // call database
   database_manager::get_instance().join_room(find_room->get_room_id(), user_id, [=](bool success, std::string room_id, std::vector<int> user_id_list)
   {  
      // How do you think I should using lock? 
      // std::lock_guard<std::recursive_mutex> lock(mutex_);

      // shared resource
      match_room_list_[room_id].join_user(user_id); 

      response_join_room_ntf(room_id, user_id_list);
   }
}
void room::join\u room(int user\u id)
{
std::锁\保护锁(互斥锁);
std::shared_ptr find_room=nullptr;
用于(自动iter:匹配房间列表)
{
如果(false==iter.second->is_public_room())
{
继续;
}
如果(true==iter.second->is_full())
{
继续;
}
find_room=iter.second;
打破
}
//某物
//异步(其他线程调用此lambda函数)
//呼叫数据库
数据库\管理器::获取\实例()。加入\房间(查找\房间->获取\房间\ id(),用户\ id,[=](bool success,std::string房间\ id,std::vector用户\ id \列表)
{  
//你认为我应该如何使用锁?
//std::锁\保护锁(互斥锁);
//共享资源
匹配\u房间\u列表\u[房间\u id]。加入\u用户(用户\u id);
响应加入会议室ntf(会议室id、用户id列表);
}
}

为什么需要将lambda传递给
数据库管理器::join\u room
函数?如果lambda是在不同的线程中运行的,那么您当然需要锁定lambda中的互斥体。这与任何其他函数没有什么不同。为什么需要将lambda传递给
数据库管理器::join\u room
函数?如果lambda是在不同的线程中运行,那么您当然需要在lambda中锁定互斥锁。这与任何其他函数都没有区别