C 11多執行緒thread引數傳遞問題

2021-10-19 14:30:31 字數 1179 閱讀 3708

//僅僅是構造乙個執行緒類,但沒有和具體化的執行緒函式關聯

thread() noexcept;

// 移動建構函式

thread( thread&& other ) noexcept;

//構造新的 std::thread 物件並將它與執行執行緒關聯

template< class function, class... args >

explicit thread( function&& f, args&&... args );

上面就是c++11執行緒建構函式 。第三個建構函式是乙個可以傳入多個引數的模板函式,也就是說傳給執行緒的執行函式的引數可以有任意多個。

其中f是任意乙個可呼叫物件,包括普通函式、函式物件 、lambda表示式等,args是傳遞給執行緒函式的引數。

需要特別注意的是,傳到執行緒函式的引數預設是按值傳遞或者被移動的,若需要傳遞引用引數給執行緒函式,則必須包裝它(例如用 std::ref 或 std::cref )。

如下:

void pause_thread(int nsleeptime, int x, int y)

int main()

此時  nsleeptime引數為1, x為3,  y為4,必須注意的是:傳入的引數個數必須和執行緒的執行函式的引數個數相同,型別相同或可以轉化為同型別,否則編譯會報錯。

//**清單 1

//函式物件

class background_task

~background_task(){}

void operator()() const

private:

int m_nnumber;

std::string m_strname;

char* m_pszname;

};// t1 非執行緒

std::thread t1;

//使用普通函式進行構造執行緒,按值傳遞

void f1(int n)

std::thread t2(f1, 10);

//使用函式物件構造執行緒,使用引用

background_task task(12, "jimmy");

std::thread run_task(std::ref(task));

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 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...