考虑以下串行函数。当我并行化我的代码时,每个线程都会从并行区域内调用这个函数(未显示)。我正在尝试使这个线程安全且高效(快速)。
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
例程?也就是说,上述涉及迭代器的操作应该只my_map
在else
语句中写入时“锁定”。但是多个线程应该能够.find
同时执行调用。
我希望我说得通。谢谢你。