0

考虑以下代码:

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);
}

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

4

1 回答 1

1

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

考虑制作 的新副本d,或使用传递副本到func. 由于data_t相对较小,因此在这种情况下您不会受到太大影响。

如果您不能通过参数复制,也许可以在内部复制(引入您可能不想要的func语义)或者您的调用者可以传入不同的实例。func

于 2013-06-27T22:28:01.050 回答