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

超实用线程调度方法!

文章目录

  • 前言
  • 一、实现思路
  • 二、实现实例
  • 三、实现效果


前言

你有想过这样一个问题吗?线程之间是如何调度的?
更具体点说是这样,有两个线程:线程A和线程B,线程B要先于线程A运行,或者是线程B运行了多次之后在启动线程A,如何进行调度?


提示:以下是本篇文章正文内容,下面案例可供参考

一、实现思路

为了确保线程B运行多次之后再启动线程A,可以使用条件变量(pthread_cond_t)和互斥锁(pthread_mutex_t)来实现同步。

1.线程B的实现:线程B在每次运行时增加count的值。
当count达到NUM_RUNS时,调用pthread_cond_signal(&cond)唤醒等待的线程A。

2.线程A的实现:线程A在启动时首先获取互斥锁,并检查count是否已经达到NUM_RUNS。
如果没有达到,调用pthread_cond_wait(&cond, &mutex)进入等待状态,直到被线程B唤醒。
被唤醒后,释放互斥锁,继续执行线程A的代码。

二、实现实例

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>#define NUM_RUNS 3// 共享变量
int count = 0;
pthread_mutex_t mutex;
pthread_cond_t cond;void* threadB(void* arg) {for (int i = 0; i < NUM_RUNS; i++) {// 线程B的代码printf("Thread B running: %d\n", i + 1);// 模拟耗时操作sleep(1);// 增加计数器pthread_mutex_lock(&mutex);count++;if (count == NUM_RUNS) {// 如果达到了指定次数,唤醒线程Apthread_cond_signal(&cond);}pthread_mutex_unlock(&mutex);}return NULL;
}void* threadA(void* arg) {// 等待线程B运行指定次数pthread_mutex_lock(&mutex);while (count < NUM_RUNS) {pthread_cond_wait(&cond, &mutex);}pthread_mutex_unlock(&mutex);// 线程A的代码printf("Thread A started\n");return NULL;
}int main() {pthread_t tidA, tidB;// 初始化互斥锁和条件变量pthread_mutex_init(&mutex, NULL);pthread_cond_init(&cond, NULL);// 创建线程Bpthread_create(&tidB, NULL, threadB, NULL);// 创建线程Apthread_create(&tidA, NULL, threadA, NULL);// 等待线程B和线程A结束pthread_join(tidB, NULL);pthread_join(tidA, NULL);// 销毁互斥锁和条件变量pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);return 0;
}

三、实现效果

编译代码,由于运用到了线程,所以需要指定线程库

gcc thread_test.c -lpthread

运行可执行文件

在这里插入图片描述


http://www.mrgr.cn/news/31858.html

相关文章:

  • Vite初始化Vue3+Typescrpt项目
  • Clickhouse集群新建用户、授权以及remote权限问题
  • 使用视频提升应用在 App Store 中的推广效果
  • MySQL数据库:SQL语言入门 【2】(学习笔记)
  • Redisson的可重入锁
  • Django 2024全栈开发指南(二):Django项目配置详解
  • 【算法】2022年第十三届蓝桥杯大赛软件类省赛Java大学C组真题
  • SQL优化之深度分页优化
  • linux安装nginx+前端部署vue项目(实际测试react项目也可以)
  • 模板初阶
  • 自闭症能上寄宿学校吗?了解解答与选择
  • PLC中几个电机控制电路
  • IDA Pro基本使用
  • 【Linux】简易日志系统
  • 剑指offer JZ54 二叉搜索树的第k个节点
  • python+selenium实现自动联网认证,并实现断网重连
  • 读取ply文件中的点云属性
  • vue3 TagInput 实现
  • 如何把python(.py或.ipynb)文件打包成可运行的.exe文件?
  • 毕业季,论文的开题报告对大学生来说意味着什么?
  • ESP32调用本地部署的ChatTTS
  • C++第1课——输出、变量和输入(含视频讲解)
  • 我与Linux的爱恋:命令行参数|环境变量
  • 2024CSP-J初赛
  • string类(C++)
  • LeetCode 滑动窗口 最少交换次数来组合所有的 1 II