使用现代C++,什么是最好的方法来拥有由一个线程初始化的共享内存,第一个到达这一点,然后由多个线程读取?它需要尽可能地轻量级。
int *ptr = nullptr;
void parallel_work() {
// this should only done by the first thread to this point
ptr = init_ptr();
// all threads read After ptr is set
do_with(ptr);
}
int main() {
std::thread th0 { ¶llel_work };
std::thread th1 { ¶llel_work };
std::thread th2 { ¶llel_work };
parallel_work();
}
如果可以的话,我真的希望避免将代码的整个读取部分 Package 在mutex
中。
PS:这不是static
函数变量的用例,因为我将在程序的生命周期中创建许多这样的变量。
3条答案
按热度按时间3b6akqbq1#
std::call_once
正是这样做的。它甚至强制其他线程等待
init_ptr
完成,并进行同步以确保它们都看到ptr
的初始化值。2ul0zpep2#
如我所述,将
ptr
设置为局部静态变量。2uluyalo3#
ScottMayer的单例就可以了,只需将statc对象放入一个函数即可:
编译器通过一个隐藏的
once_flag
对象或类似的魔术来管理第一次调用ownin函数时的初始化。