1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #include<atomic>
- #include<mutex>
- #include<thread>
- #include<iostream>
- class signal
- {
- protected:
- signal()=default;
- signal(const signal&)=delete;
- signal(signal&&)=delete;
- signal& operator=(const signal&)=delete;
- signal& operator=(signal&&)=delete;
- public:
- static signal& get()
- {
- static signal data;
- return data;
- }
- };
- class thread_signal
- {
- private:
-
- static std::atomic<thread_signal*> instance;
- static std::mutex mtx;
- public:
- static thread_signal* get()
- {
- thread_signal* data=instance.load(std::memory_order_acquire);
- if(data==nullptr)
- {
- std::lock_guard<std::mutex> lock(mtx);
- data=instance.load(std::memory_order_relaxed);
- if(data==nullptr)
- {
- data=new thread_signal();
- instance.store(data,std::memory_order_relaxed);
- }
- }
- return data;
- }
- };
- class signal_thread_local
- {
- protected:
- signal_thread_local(int _i):i(_i){};
- signal_thread_local(const signal_thread_local&)=delete;
- signal_thread_local(signal_thread_local&&)=delete;
- signal_thread_local& operator=(const signal_thread_local&)=delete;
- signal_thread_local& operator=(signal_thread_local&&)=delete;
- public:
- int i;
- static signal_thread_local& get()
- {
- thread_local signal_thread_local data(0);
- return data;
- }
- };
- void fun(int j)
- {
- signal_thread_local& re1=signal_thread_local::get();
- re1.i=re1.i+j;
- signal_thread_local& re2=signal_thread_local::get();
- std::cout<<re2.i<<std::endl;
- }
- int main()
- {
- auto i1=std::thread(fun,1);
- auto i2=std::thread(fun,2);
- i1.join();
- i2.join();
- }
|