J'ai une application multi-thread qui utilise le GPU, qui est intrinsèquement monothread, et les véritables API que j'utilise, cv::gpu::FAST_GPU
, se bloque quand j'essaie de les utiliser multi-thread, donc en gros je:Acquérir conditionnellement un std :: mutex
static std::mutex s_FAST_GPU_mutex;
{
std::lock_guard<std::mutex> guard(s_FAST_GPU_mutex);
cv::gpu::FAST_GPU(/*params*/)(/*parameters*/);
}
maintenant, l'analyse comparative du code me montre FAST_GPU()
dans l'isolement est plus rapide que le CPU FAST()
, mais dans l'application réelle de mes autres threads passent beaucoup de temps d'attente pour la serrure, de sorte que le général le débit est pire.
En regardant à travers la documentation, et at this answer il semble que cela pourrait être possible:
static std::mutex s_FAST_GPU_mutex;
static std::unique_lock<std::mutex> s_FAST_GPU_lock(s_FAST_GPU_mutex, std::defer_lock);
{
// Create an unlocked guard
std::lock_guard<decltype(s_FAST_GPU_lock)> guard(s_FAST_GPU_lock, std::defer_lock);
if (s_FAST_GPU_lock.try_lock())
{
cv::gpu::FAST_GPU(/*params*/)(/*parameters*/);
}
else
{
cv::FAST(/*parameters*/);
}
}
Cependant, cela ne compile que std::lock_guard
accepte seulement std::adopt_lock
. Comment puis-je l'implémenter correctement?
Je ne suis pas Bien sûr, vous utilisez un 'unique_lock' statique, car vous ne voudriez généralement pas que 2 threads aient accès au même' unique_lock'. Cela dit, je voudrais supprimer le s_FAST_GPU_LOCK, puis utiliser 'std :: try_to_lock', et tester s'il a réussi à utiliser' owns_lock'. –
@DaveS Ahh, je vois - 'mutex.try_lock()' puis 'lock_guard <> (std :: adopt_lock)'? S'il vous plaît faites cela en une réponse. –