C++ Lambdas和threads

C++ Lambdas和threads,c++,multithreading,lambda,c++11,C++,Multithreading,Lambda,C++11,我最近开始在线程中大量使用lambda,并希望确保我没有为以后的线程安全问题/崩溃做好准备。我通常的使用方法是: class SomeClass { int someid; void NextCommand(); std::function<void(int, int)> StoreNumbers; SomeClass(id, fn); // constructor sets id and storenumbers fn } //

我最近开始在线程中大量使用lambda,并希望确保我没有为以后的线程安全问题/崩溃做好准备。我通常的使用方法是:

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. 
}  
class-SomeClass{
内体;
void NextCommand();
std::函数存储编号;
SomeClass(id,fn);//构造函数设置id和storenumber fn
}
//从多个线程调用
静态void read_回调(int-fd,void*ptr)
{  
SomeClass*sc=静态的\u castptr;
..  
sc->StoreNumbers(someint,someotherint);//瞧,线程特定存储。
}  
静态DWORD WINAPI线程fn(LPVOID参数)
{  
std::list ints1;
std::list ints2;
自动存储编号=[&](int i,int i2){
//特定于线程的lambda。
ints1.推回(i);
ints2.向后推_(i2);
};  
SomeClass s(id、门店编号);
...  
//设置最终调用read_回调的内容,并将s设置为ptr。
}  
ThreadFn用作30-40个线程的线程函数

这可以接受吗?我通常有一些特定于线程的lambda,它们对一组特定于线程的数据进行操作


谢谢大家!

这里没有问题。使用lambda的数据访问与通过内联代码、传统函子、使用
bind
或任何其他方式使用命名函数的数据访问没有什么不同。只要lambda一次只从一个线程调用,我就看不到任何与线程相关的问题。

?不太可能,这不是“真实”的代码(我在记事本中用大约2分钟的时间编写了它,没有进行错误检查,它显示了)。我想问更多关于以这种方式使用lambda的一般想法,而不是代码本身。我也是新手,所以很想知道lambda函数的
return
值是什么?对不起,但是这段代码的目的是什么?如果您需要线程本地内存存储,那么您可以使用类似于Konstantin Knizhnik的thread alloc/new的东西:您能详细说明您试图解决的任务吗?只是不清楚你为什么需要lambdas。lambda在线程编程中很有用,例如:@c-smile:read_回调函数是当有数据要从网络读取(异步)时使用的回调函数。从网络中读取一些数据,然后使用lambda更新线程的状态。