1 数据传输

1.1 传输场景

  • 父子进程
  • 陌生进程

1.2 传输接口

1.3 传输示例

2 并发控制

2.1 并发场景

  • 整型
    • 多写
    • 一写多读
    • 多写一读
    • 多写多读
  • 数据
    • 多写
    • 多读
    • 一写多读
    • 多写一读
    • 多写多读

2.2 并发接口 (glibc)

一、自选锁

#include <pthread.h>

pthread_spinlock_t spin;

pthread_spin_init(&spin, PTHREAD_PROCESS_PRIVATE);
pthread_spin_lock(&spin);
pthread_spin_unlock(&spin);

二、互斥锁

#include <pthread.h>

pthread_mutex_t lock;

pthread_mutexattr_t attr;
thread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);

pthread_mutex_init(&lock, &attr);
pthread_mutex_lock(&lock);
pthread_mutex_unlock(&lock);

三、读写锁

#include <pthread.h>

pthread_mutex_t rdlock;

pthread_mutexattr_t attr;
pthread_rwlockattr_init(&attr);
pthread_rwlockattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);

pthread_rwlock_init(&rdlock, &attr);
pthread_rwlock_rdlock(&rdlock);
pthread_rwlock_wrlock(&rdlock);
pthread_rwlock_unlock(&rdlock);

四、信号量

#include <semaphore.h>

sem_t sem;
sem_init(&sem, 0, 8);
sem_wait(&sem);
sem_post(&sem);

五、原子写

#include <pthread.h>/* C 11 */

volatile unsigned num = 0;

__atomic_store_n(&num, 8, __ATOMIC_SEQ_CST);
unsigned cur = __atomic_load_n(&num, __ATOMIC_SEQ_CST);

2.3 并发代码

  • 整型数据

    • 场景

      • 多写
      • 一写多读
      • 多写一读
      • 多写多读
    • 实现

      /* 自旋锁 */
      void mul_write(int *num) {
          spin_lock()
          *num += 1;
          spin_unlock()
      }
      
      /* 原子变量 */
      
  • 数据

    • 多写

      /* 自旋锁 */
      void mul_write(CommBuf *buf, Data *data) {
          spin_lock()
          memcpy(buf->buf, data, data->len)
          spin_unlock()
      }
      
      /* 排他锁 */
      void mul_write(ommBuf *buf, Data *data) {
          spin_lock()
          memcpy(buf, data, ..)
          spin_unlock()
      }
      
      /* 信号量 */
      
      /* 预申请:原子变量 */
      
    • 多读

    • 一写多读

      /* 自旋锁 */
      /* 排他锁 */
      
      /* 信号量 */
      void mul_write(CommBuf *buf, Data *data) {
          spin_lock(buf->spin)
          memcpy(buf->buf, data, ..)
          spin_unlock(buf->spin)
      
          sem_post(buf->sem)
      }
      
      void read(CommBuf *buf, Data *data) {
          sem_wait(buf->sem) // 计数器为0,阻塞
      
          spin_lock(buf->spin)
          memcpy(data, buf->buf, ..)
          spin_unlock(buf->spin)
      }
      
    • 多写一读

      /* 自旋锁 */
      /* 排他锁 */
      
      /* 信号量 */
      
      /* 预申请:原子变量 + 信号量 */
      
    • 多写多读

      /* 排他锁 */
      
      /* 信号量 */
      
      /* 预申请:原子变量 + 信号量 */