我们如何在C,C ++中控制/调度线程的执行?

我们如何在C,C ++中控制/调度线程的执行?

在本文中,我们深入探讨了一个较低级别的主题,即如何调度和控制程序中线程的执行。为此,我们将同时使用C和C ++。
从以下位置下载源代码:https: //github.com/prateekparallel/InterThreadCommunication
前两个示例在C中,最后一个示例在C ++中。在我的第一种方法中,我使用了3个互斥锁和3个条件变量。通过以下示例,您可以计划或控制C和C ++中的任意数量的线程。首先,请看下面的第一个线程。在这里,它锁定了互斥锁1(以便其他线程无法访问该代码)开始执行(未添加代码,仅是注释),最后在完成其任务等待cond1之后,同样,第二个线程锁定了互斥锁2,开始执行其业务逻辑。 ,最后,等待cond2和第三个线程锁定的互斥锁lock3的条件,开始执行其业务逻辑,最后等待cond3的条件。

我在这里没有添加任何业务逻辑,因为这只是一个例子。在注释掉的部分中,您可以添加将在并行模式下执行的业务逻辑。假设线程3依赖于将要插入表中的线程1的最终输出,线程3将在创建其最终结果之前读取该信息,线程2取决于线程3的最终结果以生成其最终结果。因此,在将数据插入表中之后,线程1通过条件变量向线程3发出信号,以继续进行其最终处理。这意味着线程1控制线程3。由于线程2取决于线程3的最终结果,因此线程3控制线程2的执行。在这里,我们可以允许线程1独立执行,因为它的操作不依赖于任何其他线程,例如,对于线程控制,我们在这里控制所有线程。因此,线程1由线程2控制。

为了开始控制过程,我们首先释放线程1。在主线程中(即主函数;每个程序都有一个主线程,在C / C ++中,一旦控件通过内核传递给主方法/函数,该主线程就由操作系统自动创建)pthread_cond_signal(&cond1);。从主线程调用此函数后,正在等待cond1的thread1将被释放,它将开始进一步执行。完成最终任务后,它将调用pthread_cond_signal(&cond3);。现在,正在等待条件3的线程(即线程3)将被释放,它将开始执行其最后阶段并调用 pthread_cond_signal(&cond2); 它将释放在cond2条件下正在等待的线程,在这种情况下为thread2。这是我们可以在多线程环境中调度和控制线程执行的方式。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在第二种方法中,我使用全局变量作为控制器来控制线程。请仔细检查以下示例,以了解如何根据全局变量对它进行计划/控制。但是最好的方法是第一个示例,下面仅用于理解。在这里,我不需要解释逻辑。只需检查while循环内的“ if condition”。
在这里插入图片描述
在这里插入图片描述
现在,我的第三个示例是C ++。在这里,我使用的是与第一个C示例相同的方法。如果您直接进入此示例,请阅读我用C语言编写的第一个示例以了解该方法。在下面的示例中,我在Visual Studio 2013中开发了代码,并且没有将代码分发到单独的标头和CPP文件中。另外,我已经内联声明和定义了所有方法,因为这只是一个例子。另外,您可能会想,“为什么在类结构相同的情况下声明三个类?” 请勿混淆,我仅出于示例目的使用相同的类定义 。查看注释行中的业务逻辑。在这里,每个类都将具有不同的业务功能和逻辑。本示例适用于具有三个不同类的三个不同线程;只需假设所有类都具有不同的功能和业务逻辑就可以了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
私信小编有福利哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C 语言线程是通过操作系统提供的线程库来实现的。线程可以让程序同时执行多个任务,从而提高程序的并发性和效率。 任务调度是指操作系统根据一定的策略将 CPU 的执行时间分配给不同的线程或进程。在 C 语言,任务调度是由操作系统完成的,程序员只需要编写线程的代码,然后将线程交给操作系统进行调度。 通常情况下,线程的调度是基于优先级的。操作系统会将 CPU 时间分配给具有最高优先级的线程,直到该线程完成或被阻塞。当该线程完成或被阻塞后,操作系统会选择下一个具有最高优先级的线程运行。如果没有线程处于运行状态,那么操作系统会将 CPU 时间分配给等待队列线程。 线程在 C 语言的使用需要包含头文件 pthread.h,并使用 pthread_create() 函数创建线程,该函数会返回一个线程 ID,然后使用 pthread_join() 函数等待线程结束。 下面是一个简单的例子,它创建了两个线程并让它们同时执行: ``` #include <stdio.h> #include <pthread.h> void* thread_function(void* arg) { printf("Thread %d is running\n", *((int*)arg)); return NULL; } int main() { pthread_t thread1, thread2; int thread1_id = 1, thread2_id = 2; pthread_create(&thread1, NULL, thread_function, &thread1_id); pthread_create(&thread2, NULL, thread_function, &thread2_id); pthread_join(thread1, NULL); pthread_join(thread2, NULL); return 0; } ``` 在上面的例子,我们首先定义了一个函数 thread_function(),它将作为线程的入口点。然后我们使用 pthread_create() 函数创建了两个线程,并将它们分别赋值给 thread1 和 thread2 变量。每个线程都将调用 thread_function() 函数,并传递一个整数参数作为线程 ID。最后,我们使用 pthread_join() 函数等待线程结束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值