У меня есть поток, который берет некоторые локальные данные для каждой работы, которую он порождает. Я хотел проверить, могу ли я передать ссылку "локальная переменная" на задание (функтор)
Например,
ThreadPool tp;
void func(){
Employee emp;
tp.enqueueJob(bind(&foo,emp));
}
void foo(const Employee &emp){
//Access emp when the job is executed.
}
Итак, вопрос, в соответствии со стандартом мне будет гарантировано иметь доступ к Employee
записи, когда работа выполняется из foo
после того, как управление из func
?
Я знаю, что небезопасно предполагать, что мы имеем доступ к локальным переменным, когда мы вышли из блока, но просто хотим проверить, потому что некоторые из компиляторов разрешают возвращать локальную переменную в качестве ссылки на константу.
bind(&foo,emp)
Это берет копию emp
и вызывает функцию с этим как аргумент.
Если это то, что вы хотите, тогда все хорошо. Если вы хотите, чтобы функция действовала сама по emp
, вам необходимо:
bind(&foo, std::ref(emp))
bind
создает объект, содержащий копии своих аргументов, которые используются в качестве аргументов функции;ref
дает тип "reference wrapper", который действует как ссылка на свой аргумент.