c++11線程

原文: 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)

相關文章
相關標籤/搜索