超实用线程调度方法!
文章目录
- 前言
- 一、实现思路
- 二、实现实例
- 三、实现效果
前言
你有想过这样一个问题吗?线程之间是如何调度的?
更具体点说是这样,有两个线程:线程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
运行可执行文件