【问题标题】:What is the best technique to create a thread in C++ while passing the class and an index?在传递类和索引时在 C++ 中创建线程的最佳技术是什么?
【发布时间】:2010-02-02 20:07:07
【问题描述】:

我正在使用 pthreads 和 C++ 创建一个数据并行程序。从pthread function from a class,我发现了如何为pthread_create 提供指向静态C++ 函数的函数指针(并为其提供this 参数)。

但是,我还需要为线程提供索引,以便它知道它正在处理哪些数据。我可以为每个线程malloc 一个结构(同时包含指向 C++ 类的指针和一个索引),但这似乎会添加一些簿记代码,并且如果不释放该结构可能会导致泄漏。有没有更好的方法来做到这一点?

【问题讨论】:

  • 为什么不把那个结构放在堆栈上呢?说Context context; 而不是malloc-ing?这不会为您节省预订费用吗?
  • @Dmitry:问题是您必须保证变量的生命周期超出线程中的使用范围。如果您在 a 函数中创建一个变量,启动线程并退出该函数,那么在新创建的线程开始使用它之前,局部变量可能会被销毁(如果调用另一个函数,则会被覆盖)。当然,如果您知道情况并非如此(创建线程的同一函数也等待完成,那可能是一个简单的解决方案。

标签: c++ pthreads


【解决方案1】:

您可以使用Boost.Thread。它为您提供了一种类型安全的方式将pass more than one argument 放入您的可调用对象中。

是的,它具有与您的问题所述类似的簿记类型,但它使用 C++ 机制来确保它不会泄漏。

【讨论】:

  • 任何线程库都是不错的推荐,但 boost::thread 是我所知道的最接近下一个标准线程的库,因此对于编写 C++ 的人来说,这可能是最好的推荐
【解决方案2】:

有没有更好的方法来做到这一点?

不是真的。由于线程函数只能采用单个void * 参数,因此您要传递给线程函数的任何和所有数据都必须是包含您需要的数据的结构或类的一部分。通常的设计模式是有一个 ThreadParameters 类或结构,其中包含您需要的所有内容,如果您需要更多参数,可以添加到其中。

处理释放的最直接的方法是让线程的创建者创建分配ThreadParameters,并让线程本身在它退出之前释放ThreadParameters

【讨论】:

    【解决方案3】:

    除非您将与 this 指针相同的 C++ 对象传递给多个并发线程,否则您应该简单地将索引添加到该对象。

    我建议每个线程有一个对象,这样可以使调试更容易。使您当前的this 类成为线程对象之间通过引用共享的资源。

    如果这意味着在堆上添加新对象,只需在调用pthread_join 后立即delete 它们即可。真的没有太多出错的余地。

    【讨论】:

    • 将索引放入对象的问题是很多对象都在访问该类,我需要一种方法来区分它们。
    • @Mike:“许多对象正在访问该类”没有意义。对象属于类并访问其他对象。即使它只包含一个索引和一个指针(和一个pthread_t——你现在在哪里有你的线程对象?),它可能会改进你的程序的组织以拥有一个代表每个线程的对象。学习和使用线程库的另一个好建议是等效的:任何线程库都将以表示线程的对象为中心!
    【解决方案4】:

    如果每个线程都有一个对象(类实例)。 (我从您对this 的引用中推断出这一点。)您可以使索引成为该类的成员。这可以在构造函数中进行配置,也可以使用 setter 进行配置。

    class C { 
      Index index_; 
    public:
      C(Index &index) : index_(idx) {}
      void Run() { ... }
    }
    
    Index workSet;
    C worker(workSet);
    worker.Run();
    

    【讨论】:

      猜你喜欢
      • 2013-08-12
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 2011-07-07
      • 2017-04-11
      • 1970-01-01
      • 2010-09-10
      相关资源
      最近更新 更多