考虑以下串行功能。当我并行化我的代码时,每个线程都会在并行区域内调用此函数(未显示)。我试图使这个线程安全和高效(快速)。C++ OpenMP关键:“单向”锁定?
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
调用。
我希望我有道理。 谢谢。
但你'critical'的使用是低效我很担心 - 多线程不能simlutaneously读取地图由于'critical'。 – cmo
尽管'atomic'是个好主意。那么,我只需要在写入区域周围放置一个'atomic'和'flush'? - 读取区域需要指示? – cmo
@CycoMatto我知道。我以为我用'atomic'和'flush'完成了一些聪明的事情,发现了我的错误,并编辑了我的答案。它提供的信息可能对别人发现问题有用,但肯定不会提供您想要的锁定写作行为。 –