当前位置: 首页 > article >正文

互斥锁/信号量实现5个线程同步

互斥锁 实现同步 

互斥锁保证在同一时刻,只有一个线程可以访问共享资源,从而实现了线程同步。  

思路 

1 创建互斥锁(1个)
        pthread_mutex_t    mutex;
2 初始化互斥锁
        所有线程开始执行前,pthread_mutex_init(&mutex, NULL);
3 创建线程(5个)
        pthread_create(&threads[i], NULL, thread_function, arg);
        每个线程函数,临界区开始处用 pthread_mutex_lock 加锁,
        结束用 pthread_mutex_unlock 解锁。
4 等待 threads[i] 结束
        pthread_join(threads[i], NULL);
5 销毁互斥锁
        pthread_mutex_destroy(&mutex);

代码 

#define NUM_THREADS 5

pthread_mutex_t mutex;//创建一个互斥锁

void *thread_function(void *arg) {
    int thread_id = *(int *)arg;
    free(arg);

    pthread_mutex_lock(&mutex);
    printf("线程%d\n", thread_id);
    pthread_mutex_unlock(&mutex);

    return NULL;
}

int main() {
    pthread_t threads[NUM_THREADS];
    
    // 初始化互斥锁
    pthread_mutex_init(&mutex, NULL);

	//创建5个线程
    for (int i = 0; i < NUM_THREADS; i++) {
        int *arg = malloc(sizeof(int));
        *arg = i;
        pthread_create(&threads[i], NULL, thread_function, arg);
    }
	//等待 threads[i] 结束
    for (int i = 0; i < NUM_THREADS; i++) {
        pthread_join(threads[i], NULL);
    }

    // 销毁互斥锁
    pthread_mutex_destroy(&mutex);

    return 0;
}

运行结果 

 

信号量 实现同步 

互斥锁适用于需要严格互斥的情况,而信号量则提供了更灵活的同步控制。

思路

1 创建信号量(1个)
        sem_t semaphore;
2 初始化信号量,初始值为1
        sem_init(&semaphore, 0, 1);
3 创建线程(5个)
        pthread_create(&threads[i], NULL, thread_function, arg);
        每个线程函数,临界区开始处用  sem_wait 减少信号量的值,阻塞线程直到值大于0。
        结束处用 sem_post 增加信号量的值,从而允许其他线程进入临界区。
4 等待 threads[i] 结束
        pthread_join(threads[i], NULL);
5 销毁信号量
        sem_destroy(&semaphore);

代码

#define NUM_THREADS 5

sem_t semaphore;//创建信号量

void *thread_function(void *arg) {
    int thread_id = *(int *)arg;
    free(arg);

    sem_wait(&semaphore);
    printf("线程%d\n", thread_id);
    sem_post(&semaphore);

    return NULL;
}

int main() {
    pthread_t threads[NUM_THREADS];

    // 初始化信号量,初始值为1
    sem_init(&semaphore, 0, 1);、

    //创建5个线程
    for (int i = 0; i < NUM_THREADS; i++) {
        int *arg = malloc(sizeof(int));
        *arg = i;
        pthread_create(&threads[i], NULL, thread_function, arg);
    }
    
	//等待 threads[i] 结束
    for (int i = 0; i < NUM_THREADS; i++) {
        pthread_join(threads[i], NULL);
    }

    // 销毁信号量
    sem_destroy(&semaphore);

    return 0;
}

运行结果 

补充说明

信号量的初始值决定了可以同时访问共享资源的线程数量。
设置初始值为1,意味着信号量表现得像互斥锁。
如果需要允许多个线程同时访问,可以设置一个更大的初始值


http://www.kler.cn/a/526909.html

相关文章:

  • Day28(补)-【AI思考】-AI会不会考虑自己的需求?
  • 记录一次Sqoop从MySQL导入数据到Hive问题的排查经过
  • sem_wait的概念和使用案列
  • C++中常用的排序方法之——冒泡排序
  • GSI快速收录服务:让你的网站内容“上架”谷歌
  • github制作静态网页
  • Redis|前言
  • FreeRTOS从入门到精通 第十六章(任务通知)
  • 玄武计划--干中学,知行合一
  • 全网首发,MacMiniA1347安装飞牛最新系统0.8.36,改造双盘位NAS,超详细.36,改造双盘位nas,超详细
  • Teleporters( Educational Codeforces Round 126 (Rated for Div. 2) )
  • 爬虫基础(六)代理简述
  • jvisualvm工具使用
  • 哈工大:屏蔽LLM检索头训练忠实性
  • 158页精品PPT | 机械行业数字化生产供应链产品解决方案
  • 讯飞星火大模型API使用Python调用
  • 深入理解MySQL 的 索引
  • java的Stream流
  • Redis入门概述
  • 嵌入式知识点总结 Linux驱动 (七)-Linux驱动常用函数 uboot命令 bootcmd bootargs get_part env_get
  • 计算机图形学 通过叉乘判断一个点是否在三角形内
  • Java进阶six junit单元测试,反射,注解,动态代理
  • OVS-DPDK
  • 具身智能体空间感知基础!ROBOSPATIAL:评测并增强2D和3D视觉语言模型空间理解水平
  • 低代码产品表单渲染架构
  • 【计算机网络】设备更换地区后无法访问云服务器问题