Передача локальной переменной в качестве константной ссылки в многопоточной среде

0

У меня есть поток, который берет некоторые локальные данные для каждой работы, которую он порождает. Я хотел проверить, могу ли я передать ссылку "локальная переменная" на задание (функтор)

Например,

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?

Я знаю, что небезопасно предполагать, что мы имеем доступ к локальным переменным, когда мы вышли из блока, но просто хотим проверить, потому что некоторые из компиляторов разрешают возвращать локальную переменную в качестве ссылки на константу.

Теги:
multithreading
memory-management

1 ответ

2
Лучший ответ
bind(&foo,emp)

Это берет копию emp и вызывает функцию с этим как аргумент.

Если это то, что вы хотите, тогда все хорошо. Если вы хотите, чтобы функция действовала сама по emp, вам необходимо:

  • привязка к ссылке, bind(&foo, std::ref(emp))
  • убедитесь, что объект длится до тех пор, пока функция не завершится с ним
  • будьте осторожны, чтобы синхронизировать доступ между потоками
  • 0
    Понял. Быстрый вопрос, то есть вы имеете в виду, что bind принимает emp как значение и передает foo как константную ссылку? (и использовать std :: ref, чтобы удостовериться, что bind тоже принимает ссылку?)
  • 0
    @theAlias: Это верно. bind создает объект, содержащий копии своих аргументов, которые используются в качестве аргументов функции; ref дает тип "reference wrapper", который действует как ссылка на свой аргумент.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню