我最近开始在线程中使用lambdas非常多,并且想要确保我没有为以后的线程安全问题/崩溃做好准备。我通常使用它们的方法是:
class SomeClass {
int someid;
void NextCommand();
std::function<void(int, int)> StoreNumbers;
SomeClass(id, fn); // constructor sets id and storenumbers fn
}
// Called from multiple threads
static void read_callback(int fd, void* ptr)
{
SomeClass* sc = static_cast<SomeClass*>ptr;
..
sc->StoreNumbers(someint,someotherint); // voila, thread specific storage.
}
static DWORD WINAPI ThreadFn(LPVOID param)
{
std::list<int> ints1;
std::list<int> ints2;
auto storenumbers = [&] (int i, int i2) {
// thread specific lambda.
ints1.push_back(i);
ints2.push_back(i2);
};
SomeClass s(id, storenumbers);
...
// set up something that eventually calls read_callback with s set as the ptr.
}
ThreadFn用作30-40个线程的线程函数。
这可以接受吗?我通常有一些特定于线程的lambda,它们运行在一堆特定于线程的数据上。
谢谢!
答案 0 :(得分:2)
这里没问题。使用lambda的数据访问与具有命名函数的数据访问,通过内联代码,传统函子,使用bind
或任何其他方式进行的数据访问没有区别。只要一次只从一个线程调用lambda,我就没有看到任何与线程相关的问题的证据。