我正在使用pthreads和C ++创建数据并行程序。从pthread function from a class开始,我发现如何为pthread_create
提供一个指向静态C ++函数的函数指针(并为其提供一个this
参数)。
但是,我还需要为线程提供一个索引,因此它知道它正在处理什么数据。我可以malloc
每个线程的结构(包含指向C ++类和索引的指针),但这似乎会添加一些簿记代码,如果没有释放结构,可能会导致泄漏。有更好的方法吗?
答案 0 :(得分:8)
您可以使用Boost.Thread。它为您提供了一种类型安全的方式pass more than one argument进入您的callable。
是的,它与你提出的问题有类似的簿记,但它使用C ++机制来确保它不泄漏。
答案 1 :(得分:4)
有更好的方法吗?
不是真的。由于线程函数只能使用单个void *
参数,因此要传递给线程函数的任何和所有数据都必须是包含所需数据的结构或类的一部分。通常的设计模式是拥有一个ThreadParameters
类或结构,其中包含您需要的所有内容,以及如果需要更多参数,可以添加的内容。
处理释放的最简单方法是让创建线程的人分配ThreadParameters
,并让线程在退出之前释放ThreadParameters
答案 2 :(得分:4)
除非您将与this
指针相同的C ++对象传递给多个并发线程,否则只需将索引添加到对象中即可。
我建议每个线程有一个对象,以便在没有别的情况下使调试更容易。使当前的this
类成为线程对象之间引用共享的资源。
如果这意味着在堆上添加新对象,则在调用delete
后立即pthread_join
。真的没有太大的错误空间。
答案 3 :(得分:1)
如果有一个与每个线程关联的对象(类实例)。 (我从您对this
的引用中推断出这一点。)您可以将索引作为类的成员。这可以在构造函数中配置,也可以使用setter来配置。
class C {
Index index_;
public:
C(Index &index) : index_(idx) {}
void Run() { ... }
}
Index workSet;
C worker(workSet);
worker.Run();