想象一下超市收银台:如果所有顾客(线程)同时挤向同一个收银台(共享资源),场面会一片混乱。线程同步就是给顾客们发"排队号码牌",确保:
Linux提供5种"排队机制"解决多线程协作问题:

#include <pthread.h>
// 创建锁(相当于洗手间的"有人/无人"标识)
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void* thread_task(void* arg) {
// 尝试进入(如果里面有人就排队等待)
pthread_mutex_lock(&lock);
/* 临界区开始(你的"私人时间") */
printf("Thread %d using resource\n", *(int*)arg);
sleep(1); // 模拟耗时操作
/* 临界区结束 */
// 开门出来(让下一位使用)
pthread_mutex_unlock(&lock);
return NULL;
}
pthread_cond_t order_ready = PTHREAD_COND_INITIALIZER;
pthread_mutex_t counter_lock = PTHREAD_MUTEX_INITIALIZER;
int order_number = 0;
// 顾客线程(等待取餐)
void* customer(void* arg) {
pthread_mutex_lock(&counter_lock);
while(order_number == 0) { // 必须用while循环检查
pthread_cond_wait(&order_ready, &counter_lock); // 放下锁等待通知
}
printf("Got order %d!\n", order_number);
pthread_mutex_unlock(&counter_lock);
return NULL;
}
// 厨师线程(通知取餐)
void* chef(void* arg) {
sleep(2); // 模拟做饭时间
pthread_mutex_lock(&counter_lock);
order_number = 123;
pthread_cond_signal(&order_ready); // 叫号通知顾客
pthread_mutex_unlock(&counter_lock);
return NULL;
}
pthread_spinlock_t parking_lock;
// 初始化锁(停车场入口)
pthread_spin_init(&parking_lock, PTHREAD_PROCESS_PRIVATE);
void* driver(void* arg) {
// 开车绕圈找空位(CPU忙等待)
pthread_spin_lock(&parking_lock);
/* 停车成功(临界区) */
printf("Car %d parked\n", *(int*)arg);
// 开走释放车位
pthread_spin_unlock(&parking_lock);
return NULL;
}
#define TOURIST_COUNT 4
pthread_barrier_t meeting_point;
// 初始化屏障(设置集合人数)
pthread_barrier_init(&meeting_point, NULL, TOURIST_COUNT);
void* tourist(void* arg) {
printf("Tourist %d arrived\n", *(int*)arg);
// 等待其他游客
pthread_barrier_wait(&meeting_point);
printf("All here! Start tour\n");
return NULL;
}
Tourist 1 arrived
Tourist 3 arrived
Tourist 2 arrived
Tourist 4 arrived → 所有线程同时继续执行
All here! Start tour
All here! Start tour
All here! Start tour
All here! Start tour
pthread_rwlock_t book_lock = PTHREAD_RWLOCK_INITIALIZER;
// 读者线程(多人同时阅读)
void* reader(void* arg) {
pthread_rwlock_rdlock(&book_lock); // 获取读锁
printf("Reading book...\n");
sleep(1);
pthread_rwlock_unlock(&book_lock);
return NULL;
}
// 作者线程(独占写作)
void* writer(void* arg) {
pthread_rwlock_wrlock(&book_lock); // 获取写锁
printf("Writing new chapter...\n");
sleep(2);
pthread_rwlock_unlock(&book_lock);
return NULL;
}
| 场景 | 推荐锁类型 | 类比 |
|---|---|---|
| 短时间独占操作 | 自旋锁 | 快速便利店购物 |
| 长时间独占操作 | 互斥锁 | 餐厅包间用餐 |
| 多读少写 | 读写锁 | 图书馆 |
| 线程组协调 | 屏障 | 旅行团集合 |
| 事件通知 | 条件变量 | 咖啡厅叫号系统 |
A:参考这个简单决策流程:
A:就像超市收银台只开一个窗口:
A:遵循三个黄金法则:
联系我们
customer@ffy.com
川公网安备51015602000993