原文: http://www.codeproject.com/Articles/598695/Cplusplus11-threads-locks-and-condition-variablesapp
C++11 threads, locks and condition variables
C++11 線程,鎖和條件變量函數
This article is a walk-through the C++11 support for threads and synchronization mechanisms (mutexes and condition variables).
這篇文章主要是介紹C++11對線程和同步機制(互斥鎖和條件變量)的支持。線程
1.線程(Threads)
C++11類庫中引入了std::thread類,目的是在語言層面對線程操做提供支持。std::thread能夠在函數,lambda表達式中使用,另外它還容許你爲線程函數傳遞任何參數。code
#include <thread>
void func()
{
// do some work
}
int main()
{
std::thread t(func);
t.join();
return 0;
}對象
在這個例子裏 t 是thread對象,func()表示在線程環境下運行的函數。join()方法的調用,能夠理解爲,主線程main()阻塞在join()處,直到線程函數退出才繼續運行。固然,func函數能夠傳遞任何你須要的參數。get
void func(int i, double d, const std::string& s)
{
std::cout << i << ", " << d << ", " << s << std::endl;
}
int main()
{
std::thread t(func, 1, 12.50, "sample");
t.join();
return 0;
}同步
上面能夠看到,咱們能夠以值傳遞的方式來傳遞任何參數,可是,若是咱們想要傳引用的話,須要是用std::ref或std::cref,參考下面的例子。string
void func(int& a)
{
a++;
}
int main()
{
int a = 42;
std::thread t(func, std::ref(a));
t.join();
std::cout << a << std::endl;
return 0;
}it
程序輸出43,若是沒有使用std::ref的話則打印42。io
處理join方法外,thread還提供另外兩個操做
1)swap 交換兩個線程句柄(好像在實際項目中沒啥卵用,有實際應該過的朋友能夠來補充)
2)detach 容許線程脫離線程對象獨立運行,detach後的線程是沒法join(wait)到他的返回的;
int main()
{
std::thread t(funct);
t.detach();
return 0;
}
另外值得提一下的是關於線程異常的問題,若是線程函數拋出異常,是不能被捕獲的。
try
{
std::thread t1(func);
std::thread t2(func);
t1.join();
t2.join();
}
catch(const std::exception& ex)
{
std::cout << ex.what() << std::endl;
}
但當線程產生異常時,咱們能夠在線程中捕獲它,將其暫時存放,而在稍後的時候對異常進行處理。
std::mutex g_mutex;
std::vector<std::exception_ptr> g_exceptions;
void throw_function()
{
throw std::exception("something wrong happened");
}
void func()
{
try
{
throw_function();
}
catch(...)
{
std::lock_guard<std::mutex> lock(g_mutex);
g_exceptions.push_back(std::current_exception());
}
}
int main()
{
g_exceptions.clear();
std::thread t(func);
t.join();
for(auto& e : g_exceptions)
{
try
{
if(e != nullptr)
{
std::rethrow_exception(e);
}
}
catch(const std::exception& e)
{
std::cout << e.what() << std::endl;
}
}
return 0;
}
2.鎖(Lock)
在上面的例子中咱們須要同步控制變量g_exceptions的訪問,以確保同事只用一個線程修改(push)這個變量。C++11中提供了4中同步控制的方法:1)