码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-11-01 11:05:32      阅读:15      评论:0      收藏:0      [点我收藏+]

标签:位置   生成   声明   编写   进一步   sign   依赖   ati   thread   

在本文中,我们深入探讨了一个较低级别的主题,即如何调度和控制程序中线程的执行。为此,我们将同时使用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文件中。另外,我已经内联声明和定义了所有方法,因为这只是一个例子。另外,您可能会想,“为什么在类结构相同的情况下声明三个类?” 请勿混淆,我仅出于示例目的使用相同的类定义 。查看注释行中的业务逻辑。在这里,每个类都将具有不同的业务功能和逻辑。本示例适用于具有三个不同类的三个不同线程;只需假设所有类都具有不同的功能和业务逻辑就可以了。
技术图片
技术图片
技术图片
私信小编“资料”有福利赠送哦

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

标签:位置   生成   声明   编写   进一步   sign   依赖   ati   thread   

原文地址:https://blog.51cto.com/14985843/2545655

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!