4

ロックがどのように機能するかを理解しようとしています。

C ++で本当に単純なロックを実装したいとしましょう

class Resource{
    public:
    bool lock();
    void unlock();
    ... methods to change/read the Resource ...

    private:
    bool isLocked;
}

リソースのユーザーは を呼び出しlock()isLockedが true の場合はlock()false を返し、リソースのユーザーは待機するか、別のことを行う必要があります。isLockedが false の場合、true にlock()設定isLockedし、true を返します。その後、呼び出し元はリソースに対して必要なことを何でも行うことができます。unlock()その後、リソースを呼び出しisLockedて false に設定します。

しかし、リソースの 2 人のユーザーがlock()まったく同時に呼び出しを行った場合はどうなるでしょうか? このような状況はめったにありませんか?より正式には、これには操作を「アトミック」にすることが含まれると思いますが、lock()その言葉が何を意味するのか正確にはわかりません。

4

3 に答える 3

5

古い標準 C++ では、ロック変数自体がデータ競合しているため、独自のロックを実装することはできません。

C++11 と C11 では、まさにこの目的のために使用できるアトミック変数が追加されています。たとえば、C++ の場合:

#include <atomic>

std::atomic<bool> isLocked;

bool lock() { return !isLocked.exchange(true); }

void unlock() { isLocked = false; }

ここで重要なのは、アトミック交換と (暗黙の) アトミック ストアです。これらは特別なハードウェア命令を生成し、常に競合がなく、通常の変数で「偽造」することはできません。

于 2012-04-07T22:15:07.453 に答える
3

「アトミック」とは、操作を中断できないことを意味します。つまり、他のスレッド/プロセスの動作に関係なく、その操作のセマンティクスが同じであることを確認できます。あなたのlock()電話の何かはおそらくアトミックでなければならないでしょう。ほとんどのアーキテクチャは、アトミックな動作が保証された便利な命令を提供します。プログラミングしている上位層での柔軟性を高めるために、これらの操作に基づいて構築されたライブラリもあります。

于 2012-04-07T22:06:18.970 に答える
1

それは決して珍しいことではありません。これは競合状態と呼ばれ、マルチスレッドコードの多くの(ほとんどではないにしても)バグの原因です。

C ++標準には、スレッド/原子性などの概念が実際にはありません1。そのため、OSによって(またはおそらくBoostを介して)提供される同期プリミティブに依存する必要があります。


1.これはC++11ではもはや当てはまりません。

于 2012-04-07T22:06:39.750 に答える