我想知道boost是否具有任何有助于实现自旋锁的库。我知道boost支持互斥锁,但是我找不到在boost中显示或描述自旋锁的任何示例,任何显示如何使用boost(最好)实现自旋锁的示例都将受到赞赏。(C++ 98)
最佳答案
使用 Boost.Atomic
的示例:
#include <boost/atomic.hpp>
class SpinLock
{
boost::atomic_flag flag; // it differs from std::atomic_flag a bit -
// does not require ATOMIC_FLAG_INIT
public:
void lock()
{
while( flag.test_and_set(boost::memory_order_acquire) )
;
}
bool try_lock()
{
return !flag.test_and_set(boost::memory_order_acquire);
}
void unlock()
{
flag.clear(boost::memory_order_release);
}
};
LIVE Demo on Coliru
#include <boost/range/algorithm.hpp>
#include <boost/atomic.hpp>
#include <boost/thread.hpp>
#include <iostream>
#include <vector>
class SpinLock
{
boost::atomic_flag flag;
public:
void lock()
{
while( flag.test_and_set(boost::memory_order_acquire) )
;
}
bool try_lock()
{
return !flag.test_and_set(boost::memory_order_acquire);
}
void unlock()
{
flag.clear(boost::memory_order_release);
}
};
int main()
{
using namespace std; using namespace boost;
SpinLock lock;
vector<thread> v;
for(auto i = 0; i!=4; ++i)
v.emplace_back([&lock, i]
{
for(auto j = 0; j!=16; ++j)
{
this_thread::yield();
lock_guard<SpinLock> x(lock);
cout << "Hello from " << i << flush << "\tj = " << j << endl;
}
});
for(auto &t: v)
t.join();
}
输出为:
Hello from 0 j = 0
Hello from 1 j = 0
Hello from 3 j = 0
Hello from 2 j = 0
Hello from 3 j = 1
Hello from 1 j = 1
Hello from 3 j = 2
Hello from 2 j = 1
Hello from 1 j = 2
Hello from 2 j = 2
Hello from 1 j = 3
Hello from 2 j = 3
Hello from 1 j = 4
Hello from 3 j = 3
Hello from 2 j = 4
Hello from 1 j = 5
Hello from 2 j = 5
Hello from 1 j = 6
Hello from 2 j = 6
Hello from 1 j = 7
Hello from 2 j = 7
Hello from 1 j = 8
Hello from 2 j = 8
Hello from 3 j = 4
Hello from 2 j = 9
Hello from 3 j = 5
Hello from 1 j = 9
Hello from 2 j = 10
Hello from 1 j = 10
Hello from 2 j = 11
Hello from 3 j = 6
Hello from 1 j = 11
Hello from 2 j = 12
Hello from 3 j = 7
Hello from 1 j = 12
Hello from 2 j = 13
Hello from 3 j = 8
Hello from 2 j = 14
Hello from 3 j = 9
Hello from 1 j = 13
Hello from 2 j = 15
Hello from 1 j = 14
Hello from 3 j = 10
Hello from 1 j = 15
Hello from 3 j = 11
Hello from 3 j = 12
Hello from 3 j = 13
Hello from 3 j = 14
Hello from 3 j = 15
Hello from 0 j = 1
Hello from 0 j = 2
Hello from 0 j = 3
Hello from 0 j = 4
Hello from 0 j = 5
Hello from 0 j = 6
Hello from 0 j = 7
Hello from 0 j = 8
Hello from 0 j = 9
Hello from 0 j = 10
Hello from 0 j = 11
Hello from 0 j = 12
Hello from 0 j = 13
Hello from 0 j = 14
Hello from 0 j = 15
关于c++ - 在Boost中实现自旋锁。需要的例子,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19742993/