服务器 > 服务器 > Linux

Linux实现线程同步的多种方式汇总

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线程同步内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

nginx热部署的原理分析:nginx -s reload

06-09

浅析如何在Linux环境下运行时获取动态库路径

06-09

linux操作系统内核升级过程

06-09

Linux系统中的firewall-offline-cmd详解(收藏版)

06-09

浅析如何在Linux中自定义一条命令

06-10

Linux查看进程的资源限制信息的常见方法

06-10

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论