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