C++11同時実戦読書ノート(2)

2566 ワード

第三章
#include 
#include 
#include 
std::list some_list;
std::mutex some_mutex;
void add_to_list(int new_value)
{
   std::lock_guard<:mutex> guard(some_mutex);   // std::lock_guard  RAII 
   some_list.push_back(new_value);
}
bool list_contains(int value_to_find)
{
   std::lock_guard<:mutex> guard(some_mutex);
   return std::find(some_list.begin(),some_list.end(),value_to_find)
   != some_list.end();
}
には何も言うことはありません.の一般的な使い方は、RAIを使っています
class some_data
{
  int a;
  std::string b;
  public:
  void do_something();
};
class data_wrapper
{
  private:
  some_data data;
  std::mutex m;
  public:
  template
  void process_data(Function func)
  {
    std::lock_guard<:mutex> l(m);
    func(data);
  }
  };
some_data* unprotected;
void malicious_function(some_data& protected_data)
{
  unprotected=&protected_data;
}
data_wrapper x;
void foo()
{
  x.process_data(malicious_function);
  unprotected->do_something();
}
mutex保護を使用した関数で参照またはポインタを返さないでください.これにより、データが保護されなくなります.
unprotected->do_something();  //  mutex 
#include 
#include 
#include 
#include 
struct empty_stack: std::exception
{
  const char* what() const throw();
};
template
class threadsafe_stack
{
  private:
  std::stack data;
  mutable std::mutex m;
  public:
  threadsafe_stack(){}
  threadsafe_stack(const threadsafe_stack& other)
  {
    std::lock_guard<:mutex> lock(other.m);
    data=other.data;
  }
  threadsafe_stack& operator=(const threadsafe_stack&) = delete;
  void push(T new_value)
  {
    std::lock_guard<:mutex> lock(m);
    data.push(new_value);
  }
  std::shared_ptr pop()
  {
    std::lock_guard<:mutex> lock(m);
    if(data.empty()) throw empty_stack();
    std::shared_ptr const res(std::make_shared(data.top()));
    data.pop();
    return res;
  }
  void pop(T& value)
  {
    std::lock_guard<:mutex> lock(m);
    if(data.empty()) throw empty_stack();
    value=data.top();
    data.pop();
  }
  bool empty() const
  {
    std::lock_guard<:mutex> lock(m);
    return data.empty();
  }
};

この本では少しうるさいですが、実は私自身の理解では、stackのすべての操作、特に連続的な操作はmutexでロックしなければなりません.単一の関数だけをロックすることはできません.