我是 C++11 线程的新手,并尝试使用类的成员函数在并发线程中运行。
在回答我之前的问题时,我收到了以下建议:
std::thread t1(&SomeClass::threadFunction, *this, arg1, arg2);
我实施了上述建议。它消除了我遇到的编译错误,但引入了运行时错误。在另一个问题中,我收到了删除所有复制机制的建议。实际上,我不想复制数据,因为代码是用于有限元分析的,需要大量内存。
有什么办法可以做到这一点吗?
标题类似于以下内容。
SomeClass {
vector<int*> someVariable;
public:
~SomeClass();
void threadedMethod(bool, bool); // Inside this method the
// member vector 'someVariable' is used.
void someMethod(); // In this function the threadedMethod has
// been used twice to make 2 different thread
};
someMethod 实现是,
void SomeClass::someMethod() {
thread t1(&SomeClass::threadedMethod, *this, arg1, arg2);
thread t2(&SomeClass::threadedMethod, *this, arg1, arg2);
t2.join();
t1.join();
}
析构函数类似于以下内容,
SomeClass::~SomeClass() {
int count = someVariable.size();
for(int i=0; i < count; i++) {
delete someVariable[i];
}
}
threadMethod 访问变量。这些操作是数据并行的。结果,没有线程将写入同一个内存块。同样,读写内存是不同的。在那里,我认为我不需要任何类型的锁。
如您所见,我正在使用*this
,这导致了很多副本。我真的需要避免它。任何人都可以建议任何其他方式让我避免复制吗?
如果您需要更多解释,请告诉我。如果在我的能力范围内,我会尽量详细说明。
我正在使用带有 OS X 10.8.3 的 Intel Mac。我在 Xcode 4.6.1 上编码。编译器是 Apple LLVM 4.2(默认编译器)。