2

マルチプロセッササーバーで共有メモリを使用してプロセス間通信を行っています。コードを次のように簡略化しました。

struct MyStruct {
  uint64_t x;
};

volatile MyStruct* my_struct;  // initialized elsewhere

void MyFunction(uint64_t y) {
   while (true) {
      uint64_t current_x = my_struct->x;
      if (__sync_bool_compare_and_swap(&my_struct->x, current_x, y)) {
         DoWork(current_x, y);  // do work here depending on current_x and y
         return;
      }
   }
}

私の質問: このコードは正しいですか?

特に、追加する必要がありますか

__sync_synchronize()

行の前に

uint64_t current_x = my_struct->xそれとも、次の行のアトミック CAS が効果的にそれを行うため、冗長になりますか? ご覧のとおり、私が実質的に必要としているのは __sync_lock_test_and_set 機能です。ただし、http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.htmlから、その機能が常に期待どおりに機能しない可能性があるようです。

4

1 に答える 1

0
   while (true) {
      uint64_t current_x = my_struct->x;
      /* CAVEAT: my_struct may point to something different now */
      if (__sync_bool_compare_and_swap(&my_struct->x, current_x, y)) {

my_struct別の構造体を指している可能性があるが、元の構造体と同じ値を持っている場合xは、コードは問題ないように見えます。あなたのコードはそれが大丈夫であることを暗示しているようです、なぜならあなたはとDoWorkだけを気にしているcurrent_xからyです。

于 2012-07-10T02:15:56.137 に答える