c++11多執行緒程式設計引數傳遞若干問題
阿新 • • 發佈:2019-02-12
隨著計算機處理器多核的出現,程式設計師編寫多執行緒的需求越來越大。當處理互相獨立的任務時,我們可以更好的使用多核的多執行緒的效率,可以很大的提高執行速度,但是有時候提高的速度並不是成倍的提高,因為有的作業系統訪問資料的命中率可能會降低,因為當作業系統切換執行緒的時候,我們訪問的資料會有較大的差別。因此,多執行緒並不一定能夠成倍提高執行速度。在c++11程式設計中,我們使用多執行緒的方法非常的簡單,如果我們處理的任務可以轉化為相互獨立的任務的時候,我們可以不用加鎖,進一步提高執行速度。更多的問題其實就是:執行多執行緒函式的時候,我們傳遞的引數的變化。先上一段程式碼:
注意我們的執行緒傳遞的函式引數是引用,但是如果線上程建立傳遞引數的時候,沒有使用// Test2.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <iostream> #include <thread> #include <mutex> using namespace std; std::mutex g_lock; int num = 0; #define N 100000 void Func(int& a) { g_lock.lock(); for (int i = 0; i < N;++i) { ++num; } cout << "num value:" << num; cout << "in id" << this_thread::get_id() << endl; a = rand() % 8; cout << "a = " << a << endl; g_lock.unlock(); } int main() { int *a = new int[2]; std::thread t1(Func,std::ref(a[0])); std::thread t2(Func,std::ref(a[1])); t1.join(); t2.join(); cout << a[0] << " " << a[1] << endl; delete a; return 0; }
std::ref
進行約束的話,會在vs2015等高版本的編譯器中提示錯誤(專用化……)在vs2013中可以通過,但是執行的結果會沒有修改引數的資料,線上程傳遞的時候只是按照值傳遞的方式,當使用std::ref進行修飾的時候,我們就可以將多執行緒處理後的結果寫回