c++11標準下我們可以更加簡單地呼叫執行緒,但是執行緒呼叫就必須注意物件執行緒安全的問題。
我們可以用智慧型指標簡單地去解決物件執行緒安全問題,我嘗試了解什麼叫智慧型指標,但是最後由於腦子不夠用壓根不懂他在說什麼鬼,所以我嘗試自己寫個執行緒安全的容器。
這個執行緒容器使用的是c++11的一些新特性去實現的,所以不要嘗試用vc6神器去編譯。
首先需要用到模板類而不是繼承,因為使用模板才能確保我不用再去為這件破事而煩惱。
csafemap.hpp
#include
#include
#include
using namespace std;
typedef enum encsafemapstatus;//定義個列舉狀態
template
class csafeobject
csafeobject(const csafeobject& cc)
virtual ~csafeobject(void)
public:
bool createobject(std::functionfunc)
void ctrlitem(std::functionfunc)
func(m_data); //呼叫物件
bret = true;
} while (bret == false);
}void delete(std::functionfunc = (t1&itr) )
func(m_data);
bret = true;
} while (bret == false);
}private:
t1 m_data;//需要在多個執行緒中使用到的物件
int m_mark;//狀態計數器
std::mutex m_mtx;//鎖
};例子:
int main()
csafeobjectstrdata;
strdata.createobject((cstring&tm)->bool );
thread th1([&]() );
this_thread::sleep_for(chrono::microseconds(1));
} while (1);
});thread th2([&]() );
this_thread::sleep_for(chrono::microseconds(2));
} while (1);
});thread th3([&]() );
this_thread::sleep_for(chrono::microseconds(3));
} while (1);
});thread th4([&]() );
this_thread::sleep_for(chrono::microseconds(4));
} while (1);
});th1.detach();
th2.detach();
th3.detach();
th4.detach();
strdata.delete((cstring&itr){});//釋放物件,因為不是new出來的所以在這裡載入乙個函式釋放物件
這個容器很賤單,就是鎖上物件然後操作物件,這裡我使用了模板類,std::function,std::mutex,std::lock_guard和lambel
表示式去實現這個執行緒安全的模板。如果我們使用多個物件時這個類的簡便性就越明顯,畢竟不在需要去擔心鎖有沒有釋放,那一把鎖負責那個變數的問題,不過需要注意的是不要巢狀使用ctrlitem,需要呼叫到多個物件的時候應使用拷貝物件的方式即:
cstring str1;
strdata_1.ctrlitem((cstring&tm) );
strdata_2.ctrlitem((cstring&tm) );
#pragma once
#include
#include
using namespace std;
#ifndef logstrnor
#define logstrnor(str,...) }
#endif
template
class csafeitems
csafeitems(const csafeitems& cc)
virtual ~csafeitems(void)
public:
int fillitems(int ncount, std::functionfunc)
}return m_data.size();
}void ctrlitem(std::functionfunc)
func(t1);
bret = true;
} while (bret == false);
}void updateitem(std::functionfunc, std::functionfuncfinished)
while (data.size())
funcfinished();
break;}}
::sleep(1);
} while (1);
}void removeall()
break;}}
::sleep(1);
} while (1);
}void deleteall(std::functionfunc = (t1&itr) )
break;}}
::sleep(1);
} while (1);
}int getsize()
private:
queuem_data;
std::mutex m_mtx;
int m_nmax;
};#define def原子操作(x) \
\x; \
lock_stream->clear(); \
if(n>0) \
}#define connection(text1,text2) text1##text2
#define connect(text1,text2) connection(text1,text2)
#define initatom(tm) \
static int ntick = 0;
#include
template
class catomicobject
catomicobject(const catomicobject& cc)
virtual ~catomicobject(void)
void init(cstring strmark, std::atomic_flag*lock)
public:
void createobject(std::functionfunc)
bool createobject(std::functionfunc)
bool createobject(cstring strmark,std::functionfunc)
void ctrlitem(std::functionfunc)
void delete(std::functionfunc = (t1&itr) )
private:
t1 m_data;
std::atomic_flag*lock_stream;
cstring m_strmark;
};
c 11多執行緒程式設計 執行緒安全佇列
c11正式引入了自己的執行緒類,讓c 的多執行緒程式設計變的更加優雅。由於不同的編譯器對新特性的支援有所差異,這裡的 都是在gcc 4.8版本下編譯執行。涉及到的c 11的知識如下 thread 執行緒庫同步和互斥有關量 mutex和condition variable簡單的資源管理類 lock g...
C 11 模板的改進
在c 98 03的泛型程式設計中,模板例項化有乙個很繁瑣的地方,就是連續兩個右尖括號 會被編譯解釋成右移操作符,而不是模板參數列的形式,需要乙個空格進行分割,以避免發生編譯時的錯誤。template class x template class y int main 在例項化模板時會出現連續兩個右尖...
c 11模板的特化
前面定義的stack中,第二個模板引數要求支援back,push back,pop back等介面。如果我們已經有乙個自定義的容器array,它的定義如下 template struct array array只有put和get介面,並輔助以index引數進行元素訪問。為了讓array也能參與實現s...