#include
#include
#include
using
namespace
std;
//執行緒函式
void func(int a, int b, int c)
int main()
, 4,5,6);
t4.join();
//獲取cpu的核數
cout
<< "cpu: "
<< thread::hardware_concurrency() << endl;
//std::thread t3(func, 3, 4, 5);
return
0;}
detach可以將執行緒與執行緒物件分離,讓執行緒作為後台執行緒執行,當前執行緒也不會阻塞了.但是detach之後就無法在和執行緒發生聯絡了.如果執行緒執行函式使用了臨時變數可能會出現問,執行緒呼叫了detach在後台執行,臨時變數可能已經銷毀,那麼執行緒會訪問已經被銷毀的變數.join能保證.
雖然這種方式建立執行緒很方便,但是std::thread 出了作用域後將會析構,這個時候執行緒函式還沒執行完則會發生錯誤.
執行緒不可以複製但是可以移動.但是執行緒移動後,執行緒物件將不再代表任何執行緒了:
std::thread t(func);
//移動後,執行緒物件t不在代表任何執行緒
std::thread t1(std::move(t));
// t.join();
t1.join();
std::timed_mutex: 帶超時的獨佔互斥量,不能遞迴使用.
std::recursive_mutex: 遞迴互斥量,不帶超時功能.
std::recursive_timed_mutex: 帶超時的遞迴互斥量.
#include
#include
<
thread
>
#include
using namespace std;
std::mutex g_lock;
void func()
void f()
int main()
std::recursive_mutex遞迴鎖允許同乙個執行緒多次獲得互斥量.但是盡量不要使用遞迴鎖:
需要用到遞迴鎖定的多執行緒互斥處理往往本身就是可以簡化的,允許遞迴互很容易放縱複雜邏輯的產生,從而導致一些多執行緒同步引起的晦澀問題.
遞迴鎖比起非遞迴鎖,效率會低.
遞迴鎖雖然允許同乙個執行緒多次獲得同一互斥量,但是可重複獲得的最大次數並未具體說明,一旦超過一定次數就會丟擲異常.
帶超時的互斥量在獲取鎖的時候增加了超時等待功能,因為有時不知道獲取鎖需要多久,為了不至於一直等待獲取互斥量,就設定乙個等待超時時間,在超時後還可以做其他的的事情.
#include
#include
<
thread
>
#include
#include
using namespace std;
std::timed_mutex mutex1;
void work()
else
}}int main()
c++11提供了兩種條件變數
std::condition_variable,配合std::unique_lock進行wait操作
std::condition_variable_any,和任意帶有lock,unlock的mutex進行搭配使用,比較靈活但效率略低。
條件變數的使用過程如下:
擁有條件變數的執行緒獲取互斥鎖
迴圈檢查某個條件,如果條件不滿足,則阻塞直到條件滿足,如果條件滿足,則向下執行.
某個執行緒滿足條件執行完之後呼叫notify_one或notify_all喚醒乙個或者所有的等待執行緒.
//同步佇列的實現
#include
#include
#include
#include
#include
using
namespace
std;
template
class syncqueue
//判斷是否為空
bool isempty()
public:
syncqueue(int max):m_maxsize(max)
//相緩衝區新增資料
void put(const t& x)
//相緩衝區新增資料
m_queue.push_back(x);
//喚醒處於等待中的非空條件變數
m_notempty.notify_one();
}//從緩衝區獲取資料
void take(t& x)
);//若為空則需等待,而不能從緩衝區中取出
while(isempty())
//獲取資料
x = m_queue.front();
//刪除被獲取的資料
m_queue.pop_front();
m_notfull.notify_one();
}bool empty()
bool full()
size_t size()
};
#include
struct atomiccounter
void decrement()
intget()
};
#include
#include
#include
std:once_flag flag;
void do_once());}
int main()
C 11 多執行緒
新特性之描述 雖然 c 11 會在語言的定義上提供乙個記憶體模型以支援執行緒,但執行緒的使用主要將以 c 11 標準庫的方式呈現。c 11 標準庫會提供型別 thread std thread 若要執行乙個執行緒,可以建立乙個型別 thread 的實體,其初始引數為乙個函式物件,以及該函式物件所需要...
c 11 多執行緒
1.多執行緒的原理 同一時間內,cpu只能處理1條執行緒,只有1條執行緒在工作 執行 多執行緒併發 同時 執行,其實是cpu快速地在多條執行緒之間排程 切換 如果cpu排程執行緒的時間足夠快,就造成了多執行緒併發執行的假象。思考 如果執行緒非常非常多,會發生什麼情況?cpu會在n多執行緒之間排程,c...
C 11 多執行緒
2011 年 c 迎來重大的改革 語言層面上承認了 多執行緒 程式的存在 加入了 thread 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...