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類並不支援這樣 但是為了解決這個問題,類庫中提供了乙個支援的 使用它可以支援...