0

以下は私のユースケースです

1 つのグローバル変数があり、すべての CPU で複数のスレッドがこれにアクセスしています。

アトミック比較交換あり

auto old = global_var;
auto new_var = old
for (;;) {
            new++;
            bool got_it = atomic_compare_and_swap(global_var,
                                  old,
                                  new_var);
            if (got_it) {
                return new_var;
            }
            old = global_var;
            new_var = old;
    }

スピントライロック付

for(;;)
    {
        auto temp = go_for_work();
        if (temp -> spin.trylock() == 0 )
        {
            continue;
        }

    }

... go_for_work
{
    auto old = global_var;
    auto new_var = old
    new_var++;
    global_var  =  new_var;
    return new_var
}

これは大まかなコードですが、明確であることを願っています。不明な場合はお知らせください。

global_var は int ではなく、構造体です。

だから、私の主な目的はglobal_varを保護することです.atomic_compare_and_swapとspin.trylock()のどちらが速いですか?

4

1 に答える 1

0

ブロッキング テストを使用する必要があります。せいぜいテストとループでのスリープであるスピンロックのような非ブロッキングテストは、他のすべてのプロセスに損害を与えて多くのプロセッササイクルを必要とします。セマフォを使ってみる

于 2015-01-22T00:36:50.463 に答える