read write spinlock
生活随笔
收集整理的這篇文章主要介紹了
read write spinlock
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
發(fā)一個自己基于 C++11 寫的 read write spinlock,在 MinGW 4.8.2 (gcc 4.8 全面支持c++ 11,但由于gcc windows平臺 libstdc++ 目前還不支持 thread,所以用 boost 1.49 及以上版本作為thread庫)。
目前在 Xeon E5606 (4核8線程) Win2008 x64平臺上測試通過,但還需要在內(nèi)存弱序的arm上做進一步測試。
代碼 spinlock.cpp:
#include<atomic> #include<cassert>#define SPIN_LOCK_UNLOCK 0 #define SPIN_LOCK_WRITE_LOCK -1using std::atomic; using std::atomic_int; using std::atomic_store_explicit; using std::atomic_load_explicit; using std::atomic_compare_exchange_weak_explicit; using std::memory_order_relaxed; using std::memory_order_acquire; using std::memory_order_release; typedef atomic<int> spinlock_t;void rwlock_init(spinlock_t &l) {atomic_store_explicit(&l, SPIN_LOCK_UNLOCK, memory_order_relaxed); }void read_lock(spinlock_t &l) {int expected;int desired;while(true){expected = atomic_load_explicit(&l, memory_order_relaxed);if(expected >= 0){desired = 1 + expected;if(atomic_compare_exchange_weak_explicit(&l, &expected, desired, memory_order_relaxed, memory_order_relaxed))break; // success }}atomic_thread_fence(memory_order_acquire); // sync }void read_unlock(spinlock_t &l) {int expected;int desired;while(true){expected = atomic_load_explicit(&l, memory_order_relaxed);if(expected > 0){desired = expected - 1;atomic_thread_fence(memory_order_release); // syncif(atomic_compare_exchange_weak_explicit(&l, &expected, desired, memory_order_relaxed, memory_order_relaxed))break; // success }else{assert(false);}} }void write_lock(spinlock_t &l) {int expected;int desired;while(true){expected = atomic_load_explicit(&l, memory_order_relaxed);if(expected == SPIN_LOCK_UNLOCK){desired = SPIN_LOCK_WRITE_LOCK;if(atomic_compare_exchange_weak_explicit(&l, &expected, desired, memory_order_relaxed, memory_order_relaxed))break; // success }}atomic_thread_fence(memory_order_release); // sync }void write_unlock(spinlock_t &l) {int expected;int desired;while(true){expected = atomic_load_explicit(&l, memory_order_relaxed);if(expected == SPIN_LOCK_WRITE_LOCK){desired = SPIN_LOCK_UNLOCK;atomic_thread_fence(memory_order_release); // syncif(atomic_compare_exchange_weak_explicit(&l, &expected, desired, memory_order_relaxed, memory_order_relaxed))break; // success }else{assert(false);}} }//#include<thread> #include<boost/thread.hpp> #include<iostream>spinlock_t g_lock; long g_total; const int count = 5000;void add_job() {for(int i = 0; i < count; ++i){write_lock(g_lock);++g_total;std::cout << "Thread ++ " << boost::this_thread::get_id() << std::endl;write_unlock(g_lock);} }void read_job() {for(int i = 0; i < count; ++i){read_lock(g_lock);std::cout << g_total << std::endl;;read_unlock(g_lock);} }int main() {g_total = 0;rwlock_init(g_lock);boost::thread th1(add_job);boost::thread th2(add_job);boost::thread th3(read_job);boost::thread th4(read_job);boost::thread th5(read_job);th1.join();th2.join();th3.join();th4.join();th5.join();std::cout << "The total: " << g_total << std::endl; }編譯命令行:
g++ -std=c++11 -Wall -O2 spinlock.cpp -I/d/Sources/boost_1_55_0 -L /d/Sources/boost_1_55_0/stage/lib/ -lboost_thread-mgw48-mt-1_55 -lboost_system-mgw48-mt-1_55?
其它類型 spin lock
1)最簡單(非讀寫)的 spinlock 可以參考 boost::atomic 里面示例? ;
2)Linux kernel 中還有一類 write prefer 的spin lock,了解原理后也很容易實現(xiàn),原理可以參考文檔 Linux Kernel Development 3rd。
轉(zhuǎn)載于:https://www.cnblogs.com/JesseFang/p/3521282.html
總結(jié)
以上是生活随笔為你收集整理的read write spinlock的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XEvent--Demo--使用XEve
- 下一篇: Bootstrap+MetroNic_1