防止可能的数据竞争条件

时间:2013-06-27 22:23:31

标签: c multithreading pointers thread-safety

请考虑以下代码:

typedef double (*fpointer)(void*);

typedef struct {
  int data1;
  double data2;
} data_t;

double stuff(void* arg) {
  data_t *d = (data_t *)arg;
  ...
  // Do random things
  ...
  return data2;
}

并且考虑我有一个非阻塞函数:

void func(fpointer f, data_t* d)

本质上运行f(d)但立即返回而不等待f(d)完成(类似于MPI_Isend / MPI_Irecv)。

现在我想运行func数百次,但数据不同。类似下面的代码可以安全地运行而不会阻止竞争条件吗?如果它确实表现出未定义的行为,那么在不创建数百个数据结构的情况下,实现此类任务的替代方法是什么呢?

data_t d;
d.data1 = 1;
d.data2 = 1.5;

for (int i = 0; i < 1000; i++) {
  d.data2 += 1.0;
  func(stuff, &d);
}

如果您需要更多说明,请告诉我。我感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

根本不安全 - 如果,如你所暗示的那样 - 后台正在进行处理。您为每次迭代重复使用d的相同实例; d正在通过引用传递。

考虑制作d的新副本,或使用pass-by-copy到func。由于data_t相对较小,因此在这种情况下你不会做太多的打击。

如果您无法复制参数,可能func可以在内部复制(在您可能不需要的func上引入语义),或者您的调用者可以传入不同的实例。