1. 程式人生 > >c++11多執行緒程式設計引數傳遞若干問題

c++11多執行緒程式設計引數傳遞若干問題

 隨著計算機處理器多核的出現,程式設計師編寫多執行緒的需求越來越大。當處理互相獨立的任務時,我們可以更好的使用多核的多執行緒的效率,可以很大的提高執行速度,但是有時候提高的速度並不是成倍的提高,因為有的作業系統訪問資料的命中率可能會降低,因為當作業系統切換執行緒的時候,我們訪問的資料會有較大的差別。因此,多執行緒並不一定能夠成倍提高執行速度。在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進行修飾的時候,我們就可以將多執行緒處理後的結果寫回