【发布时间】:2023-03-11 05:56:01
【问题描述】:
考虑以下串行函数。当我并行化我的代码时,每个线程都会从并行区域内调用这个函数(未显示)。我正在尝试使这个线程安全和高效(快速)。
float get_stored_value__or__calculate_if_does_not_yet_exist( int A )
{
static std::map<int, float> my_map;
std::map::iterator it_find = my_map.find(A); //many threads do this often.
bool found_A = it_find != my_map.end();
if (found_A)
{
return it_find->second;
}
else
{
float result_for_A = calculate_value(A); //should only be done once, really.
my_map[A] = result_for_A;
return result_for_A;
}
}
几乎每次调用此函数时,线程都会成功“找到”其“A”的存储值(无论它是什么)。每隔一段时间,当调用“新 A”时,就必须计算和存储一个值。
那么我应该把#pragma omp critical 放在哪里?
虽然很简单,但在所有这些内容周围放置一个#pragma omp critical非常低效,因为每个线程都会不断地执行此操作,并且通常是只读的情况。
有没有办法实现“单向”critical 或“单向”lock 例程?也就是说,上述涉及迭代器的操作应该只有在else语句中写入my_map时才应该被“锁定”。但是多个线程应该能够同时执行.find调用。
我希望我说得通。 谢谢。
【问题讨论】:
标签: c++ parallel-processing critical-section openmp