Linux

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > Linux > Linux线程同步

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

作者:kaede

本文详细介绍了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线程同步内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文