|
@@ -0,0 +1,95 @@
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+#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();
|
|
|
+}
|