标签:c++11 thread 多线程 atomic_flag_init stdbind
多线程单例模式的实现。通过双重锁定,自旋处理,实现安全的多线程单例和共享区数据的访问。资源访问的形式采用简单等待处理.同时使用std::bind进行函数绑定。
// atomic_lock_flag_p202_6-3-3.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <atomic> #include <iostream> #include <thread> #include <Windows.h> #include <vector> using std::cout; using std::cin; using std::endl; std::atomic_flag lock = ATOMIC_FLAG_INIT; class TestLockInit { public: TestLockInit(); ~TestLockInit(); static TestLockInit * TestLockInit::getInstance(void); void display(void) { //自旋尝试加锁 while (lock.test_and_set(std::memory_order_acquire)) { } cout<<"-----"<<++i<<endl; //释放互斥锁 lock.clear(std::memory_order_release); } private: static TestLockInit * s_pTestLockInit; static std::atomic_flag lock; std::atomic<int>i; }; TestLockInit * TestLockInit::s_pTestLockInit = nullptr; std::atomic_flag TestLockInit::lock = ATOMIC_FLAG_INIT; TestLockInit * TestLockInit::getInstance(void) { if (s_pTestLockInit==nullptr) { //自旋尝试加锁 while (lock.test_and_set(std::memory_order_acquire)) { cout<<"??????????????"<<endl; } //执行初始化 if (s_pTestLockInit==nullptr) { s_pTestLockInit = new TestLockInit(); } //释放互斥锁 lock.clear(std::memory_order_release); } return s_pTestLockInit; } TestLockInit::TestLockInit():i(10) { } TestLockInit::~TestLockInit() { } void f(int n) { while (lock.test_and_set(std::memory_order_acquire)) { std::cout<<"Waiting from thread "<<n<<std::endl; } cout<< "Thred "<< n << " Starts working"<<endl; TestLockInit::getInstance()->display(); } void g(int n) { cout<< "Thread "<<n<< " is going to start."<<endl; lock.clear(); cout<< "Thread "<<n<<" Starts working" <<endl; TestLockInit::getInstance()->display(); } void h(void) { auto a = std::bind(&TestLockInit::display,TestLockInit::getInstance()); a(); } int _tmain(int argc, _TCHAR* argv[]) { lock.test_and_set();//设为默认状态; /*std::thread t1(f,1); std::thread t2(g,2); t1.join(); Sleep(100); t2.join();*/ std::vector<std::thread> vthread; for (int i = 0; i < 10; ++i) { vthread.push_back( std::move( std::thread(h) ) ); } for(std::thread & th :vthread) { th.join(); } return 0; }
标签:c++11 thread 多线程 atomic_flag_init stdbind
原文地址:http://blog.csdn.net/jingzhewangzi/article/details/41689185