升压RNG的线程的Safty [英] Thread-safty of boost RNG
问题描述
我有一个循环应由insering 1 OpenMP的编译可以很好地pararellized:
I have a loop which should be nicely pararellized by insering one openmp pragma:
boost::normal_distribution<double> ddist(0, pow(retention, i - 1));
boost::variate_generator<gen &, BOOST_TYPEOF(ddist)> dgen(rng, ddist);
// Diamond
const std::uint_fast32_t dno = 1 << i - 1;
// #pragma omp parallel for
for (std::uint_fast32_t x = 0; x < dno; x++)
for (std::uint_fast32_t y = 0; y < dno; y++)
{
const std::uint_fast32_t diff = size/dno;
const std::uint_fast32_t x1 = x*diff, x2 = (x + 1)*diff;
const std::uint_fast32_t y1 = y*diff, y2 = (y + 1)*diff;
double avg =
(arr[x1][y1] + arr[x1][y2] + arr[x2][y1] + arr[x2][y2])/4;
arr[(x1 + x2)/2][(y1 + y2)/2] = avg + dgen();
}
(除非我让每个执行完全不依赖别人的错误。很抱歉,并不是所有code的插入)。
(unless I make an error each execution does not depend on others at all. Sorry that not all of code is inserted).
不过我的问题是 - 有升压RNG线程安全的?他们似乎是指海合会code海合会所以即使GCC code是线程安全的,可能不适合其他平台的情况。
However my question is - are boost RNG thread-safe? They seems to refer to gcc code for gcc so even if gcc code is thread-safe it may not be the case for other platforms.
推荐答案
浏览通过Boost邮件列表归档给出:
Browsing through the Boost mailing list archives gives:
Boost.Random不保持全球
这将需要从保护状态
多线程技术。
Boost.Random does not maintain global state that would need protection from multi-threading.
Boost.Random是线程安全的,只要
不访问任何给定的对象
同时两个线程。 (访问
两个不同的对象是确定的,只要
因为它们不共享一个引擎)。如果你
要求此类安全问题,这是
琐碎推出自己找有
适当的互斥包装。
Boost.Random is thread-safe as long as you don't access any given object from two threads simultaneously. (Accessing two different objects is ok, as long as they don't share an engine). If you require that kind of safety, it's trivial to roll that on your own with an appropriate mutex wrapper.
这篇关于升压RNG的线程的Safty的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!