多執行緒傳參

2021-10-04 05:25:11 字數 4072 閱讀 2443

1.要避免的陷阱

1)用detach()時,如果主線程先結束,變數就會被**;所以用detach()的話,不推薦用引用,同時絕對不能用指標。

#include

#include

using

namespace std;

void

myprint

(const

int& i,

char

* pmybuf)

intmain()

2)在建立執行緒的同時,傳遞臨時物件的方法傳遞引數是可行的。只要使用傳遞臨時物件的方法,那麼子執行緒中的引數一定能在主線程執行完之前構造出來。

下面用程式來驗證:

#include

#include

using

namespace std;

classaa

(const a& a)

:m_i

(a.m_i)~a

()};

void

myprint

(const

int i,

const a& pmybuf)

intmain()

為什麼會呼叫兩次拷貝構造?不太清楚,我猜還有乙個中間變數。

a::a(

int a)建構函式執行0x7ffeef3bb770

//生成的臨時物件

a::a

(const a& a)拷貝建構函式執行0x7ffeef3bb110

//雖然myprint的第二個引數是引用,但是系統還是進行了值傳遞,因此呼叫了拷貝構造

a::a

(const a& a)拷貝建構函式執行0x7f9866500794

a::~a(

)析構函式執行0x7ffeef3bb110

a::~a(

)析構函式執行0x7ffeef3bb770

i love china!

總結,應對detach出現的時候

2.執行緒id

不同的執行緒具有不同的執行緒id,**this_thread::get_id()**來獲取。

3.臨時物件構造直接抓捕

臨時物件後在main()函式結束前已經構造完畢。

下面有兩個例子,乙個使用隱式轉換,乙個使用臨時物件。

#include

#include

using

namespace std;

classaa

(const a& a)

:m_i

(a.m_i)~a

()};

void

myprint

(const a& pmybuf)

intmain()

不使用臨時物件的執行結果如下,是在子執行緒中生成a類物件。

主線程id:0x119e8a5c0

a::a

(int a)建構函式執行0x70000d5e3ec8thread_id:0x70000d5e4000

a::~a(

)析構函式執行0x70000d5e3ec8thread_id:0x70000d5e4000

使用臨時物件的執行結果如下,是在主線程中就會生成myprint所需要的a類物件。

主線程id:0x11b1215c0

a::a

(int a)建構函式執行0x7ffee1ac5730thread_id:0x11b1215c0

a::a

(const a& a)拷貝建構函式執行0x7ffee1ac5128thread_id:0x11b1215c0

a::a

(const a& a)拷貝建構函式執行0x7fef5fc02bf0thread_id:0x11b1215c0

a::~a(

)析構函式執行0x7ffee1ac5128thread_id:0x11b1215c0

a::~a(

)析構函式執行0x7ffee1ac5730thread_id:0x11b1215c0

a::~a(

)析構函式執行0x7fef5fc02bf0thread_id:0x7000060b8000

若void myprint(const a pmybuf)中不加引用,又會增加乙個拷貝構造,只是這個拷貝構造是在子執行緒中進行的。

a::a(

int a)建構函式執行0x7ffee0211730thread_id:0x11ad085c0

a::a

(const a& a)拷貝建構函式執行0x7ffee0211128thread_id:0x11ad085c0

a::a

(const a& a)拷貝建構函式執行0x7fc35b402bf0thread_id:0x11ad085c0

a::~a(

)析構函式執行0x7ffee0211128thread_id:0x11ad085c0

a::~a(

)析構函式執行0x7ffee0211730thread_id:0x11ad085c0

a::a

(const a& a)拷貝建構函式執行0x700007578ec8thread_id:0x700007579000

a::~a(

)析構函式執行0x700007578ec8thread_id:0x700007579000

a::~a(

)析構函式執行0x7fc35b402bf0thread_id:0x700007579000

std::ref()函式的作用,可以實現真正的引用。

以下程式可以驗證執行緒是值傳遞。

#include

#include

using

namespace std;

classaa

(const a& a)

:m_i

(a.m_i)~a

()};

void

myprint

(const a& pmybuf)

intmain()

使用ref()實現引用傳遞。

#include

#include

using

namespace std;

classaa

(const a& a)

:m_i

(a.m_i)~a

()};

void

myprint

(a& pmybuf)

intmain()

不會再呼叫拷貝建構函式了。

a::a(

int a)建構函式執行0x7ffee5bda750thread_id:0x1192c65c0

pmybuf.m_i的值是多少:100子執行緒id:0x70000ed83000

100a::~a

()析構函式執行0x7ffee5bda750thread_id:0x1192c65c0

智慧型指標

#include

#include

#include

using

namespace std;

void

myprint2

(unique_ptr<

int> pzn)

intmain()

#include

#include

using

namespace std;

classaa

(const a& a)

:m_i

(a.m_i)~a

()void

thread_work

(int num)

void

operator()

(int num)};

intmain()

c 多執行緒 傳參

向執行緒傳遞引數 1 必要的標頭檔案 include 多線成標頭檔案 include c的stdlib標頭檔案 include 最好不要用 using namespace std 巨集定義 define numthread 5 定義乙個函式,列印hello world,這個函式有傳入值 void p...

關於多執行緒傳參問題

無引數 我們都知道使用多執行緒最簡單的方式是下面這樣 void somemethod void createthread 乙個引數 但是如果要是想給somemethod方法傳入引數的話,發現這種方法不好用了 因為thread類並不支援這樣 但是為了解決這個問題,類庫中提供了乙個支援的 使用它可以支援...

關於多執行緒傳參問題

無引數 我們都知道使用多執行緒最簡單的方式是下面這樣 void somemethod void createthread 乙個引數 但是如果要是想給somemethod方法傳入引數的話,發現這種方法不好用了 因為thread類並不支援這樣 但是為了解決這個問題,類庫中提供了乙個支援的 使用它可以支援...