使用 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);
}
您没有加入线程 a
和 b
。因此,当您的程序执行完毕时,它们可能仍然 运行。
您应该在某处添加 a.join()
和 b.join()
,或者可能只是删除它们,因为如果保留它们,main
函数中的断言将会失败。
另一个问题是您需要在互斥构造函数中显式初始化 atomic_flag
实例。它可能不会在您的示例中引起问题,因为全局变量是 zero-initialized,但这可能会在以后引起问题。
这是一个使用 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);
}
您没有加入线程 a
和 b
。因此,当您的程序执行完毕时,它们可能仍然 运行。
您应该在某处添加 a.join()
和 b.join()
,或者可能只是删除它们,因为如果保留它们,main
函数中的断言将会失败。
另一个问题是您需要在互斥构造函数中显式初始化 atomic_flag
实例。它可能不会在您的示例中引起问题,因为全局变量是 zero-initialized,但这可能会在以后引起问题。