使用 atomic_flag 的 C++ 简单互斥体(代码不工作)

C++ simple mutex using atomic_flag (code not working)

这是一个使用 atomic_flag 和 acquire/release 内存模型来实现非常简单的互斥锁的练习。 有THREADS个线程,每个线程递增cou个LOOP次数。线程与这个简单的互斥锁同步。但是,代码在 thread.join() 函数中抛出异常。有人可以告诉我为什么这不起作用吗?提前致谢!

#include <atomic>
#include <thread>
#include <assert.h>
#include <vector>

using namespace std;
class mutex_simplified {
private:
    atomic_flag flag;
public:
    void lock() {
        while (flag.test_and_set(memory_order_acquire));
    }

    void unlock() {
        flag.clear(memory_order_release);
    }
};

mutex_simplified m_s;
int cou(0);
const int LOOP = 10000;
const int THREADS = 1000;
void increment() {
    for (unsigned i = 0; i < LOOP; i++) {
        m_s.lock();
        cou++;
        m_s.unlock();
    }
}

int main() {
    thread a(increment);
    thread b(increment);
    vector<thread> threads;

    for (int i = 0; i < THREADS; i++)
        threads.push_back(thread(increment));

    for (auto & t : threads) {
        t.join();
    }
    assert(cou == THREADS*LOOP);
}

您没有加入线程 ab。因此,当您的程序执行完毕时,它们可能仍然 运行。

您应该在某处添加 a.join()b.join(),或者可能只是删除它们,因为如果保留它们,main 函数中的断言将会失败。

另一个问题是您需要在互斥构造函数中显式初始化 atomic_flag 实例。它可能不会在您的示例中引起问题,因为全局变量是 zero-initialized,但这可能会在以后引起问题。