C++11 atomic_flag总结

// atomic_flag as a spinning lock
#include        // std::cout
#include          // std::atomic_flag
#include          // std::thread
#include          // std::vector
#include         // std::stringstream

std::atomic_flag lock_stream = ATOMIC_FLAG_INIT;
std::stringstream stream;

void append_number(int x) {
	while (lock_stream.test_and_set()) {}
	stream << "thread #" << x << '\n';
	lock_stream.clear();
}

int main()
{
	std::vector<std::thread> threads;
	for (int i = 1; i <= 10; ++i) threads.push_back(std::thread(append_number, i));
	for (auto& th : threads) th.join();

	std::cout << stream.str();
	return 0;
}

上面是使用atomic_flag实现的一个简单的自旋锁,这是www.cplusplus.com给出的示例程序。

一直对std::amotic_flag的成员函数test_and_set()理解不到位。可以换一种方式思考。

std::atomic_flag lock_stream = ATOMIC_FLAG_INIT;被初始化后即为false调用test_and_set()时,如果lock_streamfalse,将其设置为true, 然后该函数返回false;如果lock_streamtrue, 不进行设置(因为已经为true了), 返回true

void append_number(int x)函数中,当lock_stream获得锁时(即lock_stream之前为false,被设置为true),lock_stream.test_and_set()返回false,退出while()循环,执行之后的代码。其他线程由于lock_stream.test_and_set()未获得锁,返回true,之后循环尝试直到获取到锁退出循环。

你可能感兴趣的:(C++11)