按重要性排列:
(1)首要原则是尽量最低限度地共享对象,减少需要同步的场合。一个对象能不暴露给别的线程就不要暴露;如果要暴露,优先考虑immutable对象;实在不行才暴露可以修改的对象,并用同步措施来充分保护它。
(2)其次是使用高级的并发编程机构,如TaskQueue,Producer_Consumer Queue,CountDownLatch等等
(3)最后不得已必须使用底层同步原语时,只用非递归的互斥器和条件变量,慎用读写锁,不要用信号量。
(4)除了使用atomic整数之外,不自己编写lock_free代码,也不要用内核级的同步原语。不凭空猜测“哪种做法性能更好”,比如spin lock 和mutex。
其中:TaskQueue是SAE为开发者提供的分布式任务队列服务,用来以异步HTTP方式执行用户任务。
Producer_Consumer Queue就是常见的生产者消费者模型:(c++里面用的比较多)
一个线程可以往共享资源队列里放东西,另外一个可以从里面取东西。对于producer线程来说,它需要考虑的就是如果我往资源队列里放东西时,队列满了,那么我必须要等待consumer线程取走一部分元素,这样才能继续进行。另外,和其他线程访问同一个资源队列的时候,还要保证访问是线程安全的。同样,对于consumer线程来说,如果资源队列是空的,同样,该线程也必须要等待producer线程将产生的元素放入队列。