9人参与 • 2025-06-09 • Linux
想象一下超市收银台:如果所有顾客(线程)同时挤向同一个收银台(共享资源),场面会一片混乱。线程同步就是给顾客们发"排队号码牌",确保:
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; }
场景 | 推荐锁类型 | 类比 |
---|---|---|
短时间独占操作 | 自旋锁 | 快速便利店购物 |
长时间独占操作 | 互斥锁 | 餐厅包间用餐 |
多读少写 | 读写锁 | 图书馆 |
线程组协调 | 屏障 | 旅行团集合 |
事件通知 | 条件变量 | 咖啡厅叫号系统 |
到此这篇关于linux实现线程同步的五种方式的文章就介绍到这了,更多相关linux线程同步内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论