Linux实现线程同步的方式有哪些?

2025-06-09 10:56:01 0点赞 0收藏 0评论

什么是线程同步?

想象一下超市收银台:如果所有顾客(线程)同时挤向同一个收银台(共享资源),场面会一片混乱。线程同步就是给顾客们发"排队号码牌",确保:

  • 有序访问:每次只处理一个顾客

  • 协调工作:收银员(CPU)高效服务

  • 避免冲突:防止算错账(数据错误)

Linux提供5种"排队机制"解决多线程协作问题:

非凡云-ffy.com非凡云-ffy.com

一、互斥锁(单人洗手间规则)

#include // 创建锁(相当于洗手间的"有人/无人"标识) pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; void* thread_task(void* arg) { // 尝试进入(如果里面有人就排队等待) pthread_mutex_lock(&lock); /* 临界区开始(你的"私人时间") */ printf("Thread %d using resourcen", *(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 parkedn", *(int*)arg); // 开走释放车位 pthread_spin_unlock(&parking_lock); return NULL; }

适用场景:

  • 极短操作(<0.1毫秒)

  • 内核开发

  • 实时系统

注意事项:

  • ⚠️ 会浪费CPU资源

  • ✅ 比互斥锁响应更快

参考文章:Linux线程同步入门指南

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
0
扫一下,分享更方便,购买更轻松