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