码迷,mamicode.com
首页 > 编程语言 > 详细

c++ 高效并发编程

时间:2018-04-29 16:27:36      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:OLE   可重入   message   顺序   write   passing   其他   The   完成   

高效并发编程

并发编程的基本模型包括,通过消息机制来管理运行顺序的message passing, 通过互斥保护共享的shared memory。

线程同步的基本原则

  1. 最低限度共享变量,考虑使用immutable对象
  2. 尽量减小锁粒度
  3. 互斥器和条件变量足以完成绝大多数任务,尽量使用高层的封装
  4. 避繁就简,读写锁 信号量 可重入锁 ,慎用。

关于死锁

  1. RAII 控制锁区间
  2. 注意锁的获取顺序

Copy On Write 减小锁粒度

只读的情况下用shared_ptr 轻量级共享数据
在发生修改的情况下,对发生次数较小的情况做数据拷贝,比如说我们的数据每秒钟被读取一百次,平均每十秒添加一次数据,那么就针对添加数据的情况做Copy on write,添加数据时如果数据被使用,就copy一份!(由于使用数据线程保存了一份shared_ptr,所以没有问题)
我们来看一个例子

class Foo
{
 public:
  void doit() const;
};

typedef std::vector<Foo> FooList;
typedef boost::shared_ptr<FooList> FooListPtr;
FooListPtr g_foos;
MutexLock mutex;

void post(const Foo& f)
{
  printf("post\n");
  MutexLockGuard lock(mutex);
  if (!g_foos.unique())//有其他线程在读,重新拷贝一份
  {
    g_foos.reset(new FooList(*g_foos));
    printf("copy the whole list\n");
  }
  assert(g_foos.unique());
  g_foos->push_back(f);
}

void traverse()
{
  FooListPtr foos;
  {
    MutexLockGuard lock(mutex);
    foos = g_foos;
    assert(!g_foos.unique());
  }

  // assert(!foos.unique()); this may not hold

  for (std::vector<Foo>::const_iterator it = foos->begin();
      it != foos->end(); ++it)
  {
    it->doit();
  }
}

void Foo::doit() const
{
  Foo f;
  post(f);
}

int main()
{
  g_foos.reset(new FooList);
  Foo f;
  post(f);
  traverse();
}

c++ 高效并发编程

标签:OLE   可重入   message   顺序   write   passing   其他   The   完成   

原文地址:https://www.cnblogs.com/joeylee97/p/8971058.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!