4

新しい標準 C++ アトミック インクリメント操作では、値をインクリメントする前にチェック前提条件を使用して、アトミック値が指定された値よりも小さいか?

次のコードよりも簡単かつ迅速に実行できますか?

int atomic_inc(std::atomic_int& val, int less_than) {
 int new_val;
 int old_val = val.load();
 do
 {
   if (old_val > less_than) return old_val;
   new_val = old_val + 1;
 } while (!val.compare_exchange_weak(old_val, new_val));

 return new_val;
}

compare_exchange_weak の仕組みがわからない場合: compare_exchange_weak は val を読み取り、old_val と比較し、等しくない場合は val を old_val に保存します。等しい場合は、new_val を val に保存します。

4

3 に答える 3

1

いいえ、値未満の値をインクリメントするための特別なサポートはありません。あなたのコードは可能な限り効率的です。C++11 にはウェイトフリーのバリアントはありません

「X の場合にインクリメント」パターンは無限にあります。ハードウェア メーカーは、サポートする必要があるのは「変更されていない場合はインクリメント」のみであると判断しました。

理論的には、特別なアセンブリ コードを使用してハードウェア プラットフォームを発明することはできますが、C++11 はそれを直接ターゲットにすることはありません。

于 2013-09-12T02:42:38.777 に答える
-4

スレッドを使用している場合は、mutex を使用してアトミック インクリメントを実行できます。この場合、次のようにします。

ミューテックスをグローバルに宣言して初期化します。

pthread_mutex_t lock;
pthread_mutex_init(&lock, NULL)

1 つのスレッドで:

int atomic_inc(std::atomic_int& val, int less_than) {
    pthread_mutex_lock(&lock);
    int newVal = val.load();
    if (newVal < less_than)
        newVal++
    pthread_mutex_unlock(&lock);
    return new_val;
}

val他のスレッドで変更する前に、ミューテックスをロックおよびロック解除する必要があります。

ミューテックスの詳細については、http ://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html#SYNCHRONIZATION を参照してください。

于 2012-12-08T14:22:41.627 に答える