Эквиваленты TBB в C++11

У меня есть старая кодовая база, где я хочу использовать некоторые реализации в новой среде. Старая база использовала структуру TBB, с которой я действительно незнаком.

Существуют ли какие-либо эквиваленты реализации этих типов TBB в C++11:

  • TBB:: enumerable_thread_specific<...>
  • mutex_t
  • mutex_t:: scoped_lock

Если нет: какие-либо советы, как я могу их преобразовать (ссылки на хорошие резюме TBB, учебные пособия,...) или мне нужно работать со всей документацией TBB?

(И нет. Вставка TBB в проект не вариант.)

РЕДАКТИРОВАТЬ: не забудьте упомянуть tbb:: this_tbb_thread:: дать какие-либо предложения по этому поводу?

2 ответа

Решение

Функции TBB в вашем коде имеют почти эквиваленты в C++11 (или вы можете просто создать их).

  1. enumerable_thread_specific<T> является реализацией потокового локального хранилища. Он может использовать локальное хранилище платформы или tbb::concurrent_vector держать экземпляры. По умолчанию не используются локальные ключи хранилища потока платформы. C++11 имеет thread_local классификатор, поэтому в зависимости от того, как enumerable_thread_specific используется, вы можете заменить его на thread_local версия того же типа. Если вы используете структуру для сохранения данных или для доступа к ним вне локального контекста потока, вам может быть отказано в работе.
  2. mutex_t является универсальным типом мьютекса и может быть заменен std::mutex хотя разработчик, возможно, выбрал конкретную реализацию (например, spin_mutex) что будет зависеть от замены.
  3. scoped_lock является объектом RAII, который блокирует мьютекс при создании, и когда выход из области действия разблокирует мьютекс (делая его несколько дружественным к исключениям.) Вы можете использовать std::lock_guard<std::mutex> если вы на C++17, в противном случае вы можете бросить свой собственный.
  4. Прошло некоторое время с тех пор, как я прочитал документацию по урожайности. Я полагаю, что реализация ищет другие возможные задачи, прежде чем отказаться от временного интервала. Ты можешь использовать std::this_thread::yield() чтобы пополнить временной интервал, но поведение может отличаться, если код использует конструкции TBB. Тот факт, что вы не упомянули какие-либо другие материалы по TBB, подразумевает, что в программе их нет, и tbb::yield() делает то же самое, что и std::this_thread::yield(),

Я бы посоветовал сделать так, чтобы старая кодовая база работала сначала и только потом менялась

tbb::enumerable_thread_specific<...> не имеет стандартных эквивалентов.

mutex_t а также mutex_t::scoped_lock Вы можете заменить на std::mutex а также std::unique_lock<std::mutex>,

Другие вопросы по тегам