【发布时间】:2013-12-05 17:55:38
【问题描述】:
我正在编写一个 randomAnimalGenerator。它是一个多线程 C 程序,使用 VS2010,适用于 Windows X64,将用于为动物园随机生成动物。
我怎样才能使不同的线程都安全地写入全局结构(“动物园”)的成员,而不在动物园结构上实施锁?这 全局结构的值总是只会递增 (++),不会递减 (--)。在下面的代码中,在不使用 OMP 的情况下,狮子、老虎和熊的正确值分别为 45,000。但是使用并行循环的值不等于 45,000。
有没有办法让 Openmp 将这些写入安排到同一个变量,而不会弄乱制作结构的私有版本?
#define LIONS 1
#define TIGERS 2
#define BEARS 3
// global struct
struct
{
int lions;
int tigers;
int bears;
} zoo;
void addAnimalsToZoo(void)
{
int animalType = randomAnimalGenerator();
if (animalType == LION)
++zoo.lions;
else
if (animalType == TIGER)
++zoo.tigers;
else
if (animalType == BEAR)
++zoo.bears;
else
printf("unknown animal type generated\n");
}
void myZooMaker(void)
{
#pragma omp parallel for
for (int i = 0; i < 45000; ++i)
addAnimalsToZoo();
}
【问题讨论】:
-
那么我可以假设 OpenMp 会正确地安排事情,所以如果 2 个或更多线程同时尝试 ++zoo.lions,数据竞速不会有问题, ETC?我在文档中找不到任何关于此的内容。
-
让每个线程写入相同的共享数据结构将是低效的。相反,您应该让每个线程写入数据结构的私有版本。然后将每个私有版本合并到一个关键部分。这样既高效又安全。
-
实际上,我只是能够写一个不同的案例并发现这不是线程安全的。我已经编辑了我的问题。
-
这应该是一个完整的 c*********k 因为
++不能保证是原子的,并且您将有多个线程同时在zoo上运行。这几乎就是数据竞赛的定义。 -
@HighPerformanceMark,是的,你是对的,虽然我不确定 c*******k 是什么。我已经编辑了我的问题,但看起来我无法轻松地在并行循环中实现它......或者至少它超出了我抱歉的编程技能......
标签: c multithreading parallel-processing thread-safety openmp