线程通信基础汇总(C语言实现)

一、为什么需要线程通信?

当多个线程需要共享资源或协调任务时,需要通过通信机制保证:

  1. 数据访问的安全性

  2. 执行顺序的合理性

  3. 资源分配的高效性

二、常用通信方式

1. 互斥锁(Mutex)

原理:通过加锁机制保护临界区

#include 

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int shared_data = 0;

void* thread_func(void* arg) {
    pthread_mutex_lock(&mutex);
    shared_data++; // 临界区操作
    pthread_mutex_unlock(&mutex);
    return NULL;
}

适用场景:简单的资源独占访问

2. 条件变量(Condition Variables)

原理:线程间的状态通知机制

pthread_mutex_t cond_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int ready = 0;

// 等待线程
void* consumer(void* arg) {
    pthread_mutex_lock(&cond_mutex);
    while(!ready) {
        pthread_cond_wait(&cond, &cond_mutex);
    }
    // 处理数据...
    pthread_mutex_unlock(&cond_mutex);
    return NULL;
}

// 通知线程
void* producer(void* arg) {
    pthread_mutex_lock(&cond_mutex);
    ready = 1;
    pthread_cond_signal(&cond);
    pthread_mutex_unlock(&cond_mutex);
    return NULL;
}

适用场景:生产者-消费者模型

3. 信号量(Semaphore)

原理:计数器实现资源管理

#include 

sem_t sem;
void* worker(void* arg) {
    sem_wait(&sem);   // P操作
    // 使用共享资源
    sem_post(&sem);   // V操作
    return NULL;
}

int main() {
    sem_init(&sem, 0, 3); // 初始化3个可用资源
    // 创建线程...
    sem_destroy(&sem);
    return 0;
}

适用场景:限制同时访问资源的线程数量

4. 读写锁(Read-Write Lock)

原理:区分读/写访问权限


pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;

// 读线程
void* reader(void* arg) {
    pthread_rwlock_rdlock(&rwlock);
    // 读取操作...
    pthread_rwlock_unlock(&rwlock);
    return NULL;
}

// 写线程
void* writer(void* arg) {
    pthread_rwlock_wrlock(&rwlock);
    // 写入操作...
    pthread_rwlock_unlock(&rwlock);
    return NULL;
}

适用场景:读多写少的场景

三、如何选择通信方式?

机制 特点 适用场景
互斥锁 简单独占访问 单一资源保护
条件变量 状态等待/通知 线程执行顺序控制
信号量 资源计数管理 连接池/资源池管理
读写锁 区分读写权限 配置文件等读多写少场景
屏障(Barrier) 线程集合等待(本文未展开) 多阶段任务处理

四、注意事项

  1. 避免死锁:确保加锁顺序一致

  2. 最小化临界区:减少锁的持有时间

  3. 优先使用高层API:如C11的

  4. 编译时添加 -lpthread 参数

你可能感兴趣的:(前端,数据库,算法)