Лямбды и нити - PullRequest
       19

Лямбды и нити

3 голосов
/ 15 июня 2011

Я недавно начал использовать 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 потоков.

Это приемлемо?У меня обычно есть несколько таких специфичных для потока лямбд, которые работают с кучей специфичных для потока данных.

Спасибо!

1 Ответ

2 голосов
/ 15 июня 2011

Здесь нет проблем. Доступ к данным с помощью лямбды не отличается от доступа к данным с помощью именованной функции через встроенный код, традиционный функтор, созданный с помощью bind, или любым другим способом. Пока эта лямбда вызывается только из одного потока за раз, я не вижу никаких свидетельств связанных с потоками проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...