当前位置: 首页 > 知识库问答 >
问题:

如何在cpp中使用线程来实现来自两个不同类的两个方法的并行执行?

上官兴昌
2023-03-14

因此,我一直在尝试使用std::Thread对象在另一个类的方法执行过程中启用另一个类方法的执行。伪代码如下所示。

class A (init_A_args ){
 A::method1(args_method1) {

   method1 functionality;
   return;  
}

 A::callback_method2(args_method2) {
   method2 functionality; 
   return; 
}
}

class B (init_B_args){
 B::method1(args_B_method1) {
    method1 functionality;
    return; 
}

 B::method2(args_B_method2)
    method2 functionality; 
    return; 
}

所以我想做的是如下所示:

A::callback_method2(args_method2) {
   init class B; 
   for (condition){
       classB.method2(); // should call this method periodically but in such way that it doesn't
       ...;             // block execution of rest of the for loop
       rest-of-the-for-loop; 
       ...; 
   }
   classB.stop(); 
   return; 
}

我不确定如何做到这一点,但我非常确定我需要使用线程。我能够在类A回调方法中实例化类B,但是,在调用ClassB.Method2()之后;for循环停止,在classb.method2()中继续执行。因此classb.method2()阻止类A的回调方法中的for循环。然而,我希望执行classb.method2()但继续执行A::callback_method2中的for循环。在超出A::Callback_Method2的范围后,应停止并销毁类B。因此,我想在类A和实例化的类B(例如method2)中优雅地切换回调方法的执行。
我一直在尝试使用std::thread,但运气不好,我可能做错了什么。因此,为了澄清,A::Callback_Method2应该实例化类B,并定期调用B.Method2(),同时继续for循环执行,这样B.Method2将在后台运行,而for循环正常执行。我有main函数,但它应该只实例化类A,然后类又实例化B,所以我不确定这与我的问题语句有什么关系(因为我主要在main方法中看到了thread.join()thread.detach()

共有1个答案

孟品
2023-03-14

您可以为std::thread对象提供一个可调用对象(可以调用的东西),并且thread对象将运行该可调用对象。如果您不希望线程阻塞执行,您应该分离线程,这样它就变成了一个守护进程线程,这意味着它在后台运行,而不阻塞执行的主线程。在使用这个解决方案时,您应该考虑线程上的可调用运行的副作用:如果它不影响其作用域之外的变量/状态,您就不需要担心太多,但是如果它影响了,您就需要注意线程的安全性:必须查看对变量的并发访问。

#include <iostream>
#include <thread>

using namespace std;

void method1()
{
    long long j = 0;
    for(int i = 0; i < 10000; ++i)
    {
        j += i;
    }
    cout << "Sum is: " << j << endl;
}

int main()
{
    thread t1(method1);
    t1.detach();
    cout << "Stuff on main thread." << endl;
    return 0;
}
 类似资料:
  • 我有一个情况,我需要启动两个线程一个接一个。我尝试了以下代码片段,在这里我可以启动Thread12,但不能启动Thread2。我怎样才能开始两个......?如何启动两个线程一个接一个...? 代码片段

  • 在一次采访中,有人问我,关于多线程,假设在同一个对象上有两个线程(线程1和线程2)。Thread-1在synchronized method1()中,Thread-2能以任何方式在java中同时进入synchronized method2()吗? 我回答“不”。这里,当Thread-1处于synchronizedmethod1()时,它必须持有对象监视器上的锁,并且只有当它退出synchroniz

  • 我有两个jms消费者,每个都在不同的流中。我想使用另一个流来聚合这两条消息的消息。并且还需要保留相关ID,因为我需要分割有效负载并发送回消息。 我尝试将分散收集与两个入站 VM 一起使用,但收到以下错误: 由以下原因导致:组织.xml.sax.SAXParse 异常:cvc-complex-type.2.4.a:发现以元素“vm:入站终结点”开头的无效内容。“{”http://www.muleso

  • 我的两个方法中的操作是相同的,但是输入参数类型不同,那么我该如何优化这两个方法,似乎没有那么重复?因为它们的操作是相同的,但参数类型不同,我该怎么做才能使这段代码更优雅呢?

  • 本文向大家介绍PHP中多线程的两个实现方法,包括了PHP中多线程的两个实现方法的使用技巧和注意事项,需要的朋友参考一下 PHP本身是不是支持多线程的,不过我们可以借助其他的方法来实现多线程,比如 shell 服务,比如 web 服务器,本文我们来讲讲这两个方法如何实现。需要的朋友可以来参考一下。 多线程是java中一个很不错的东西,很多朋友说在php中不可以使用PHP多线程了,其实那是错误的说法P

  • 我有一个java类,它打开两个Chrome浏览器,分别搜索“测试1”和“测试2”。然而,一旦两个浏览器都打开,只有一个带有谷歌页面的浏览器会搜索“测试1测试2”。 我相信这个问题可能是因为我从父类调用驱动程序 = 新的 WebDriver。但是,我不确定如何解决此问题。 下面是我尝试并行运行的两个方法。 这是我用来调用它们的xml文件。 包含驱动程序的父方法 当前结果:打开两个浏览器,每个浏览器都