请考虑以下代码:
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);
}
如果您需要更多说明,请告诉我。我感谢任何帮助。
答案 0 :(得分:1)
根本不安全 - 如果,如你所暗示的那样 - 后台正在进行处理。您为每次迭代重复使用d
的相同实例; d
正在通过引用传递。
考虑制作d
的新副本,或使用pass-by-copy到func
。由于data_t
相对较小,因此在这种情况下你不会做太多的打击。
如果您无法复制参数,可能func
可以在内部复制(在您可能不需要的func
上引入语义),或者您的调用者可以传入不同的实例。