C 多线程编程之在类中使用多线程(thread)的方法
生活随笔
收集整理的這篇文章主要介紹了
C 多线程编程之在类中使用多线程(thread)的方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、thread的基本用法
參見C++使用thread類多線程編程?。
二、類外使用多線程,訪問類的成員
這幾種方式,新建線程都是在類外,然后通過把友元函數或者成員函數作為thread參數。
#include <iostream>
#include <thread>
#include <vector>
using namespace std;class Position {
public:Position(int xx, int yy) : _x(xx), _y(yy) {};int& x(){ return _x; }int& y(){ return _y; }void member_func(int i) {printf("member_func:%d\n", i);_x = 100;}friend void pointer_style(Position *p, int i);friend void reference_style(Position &p, int i);private:int _x;int _y;
};//! 友元函數,通過指針來傳遞類的實例
void pointer_style(Position *p, int i) {printf("pointer_style:%d(%d,%d)\n", i, p->_x, p->_y);p->_x = 200;
}//! 友元函數,通過引用來訪問類的實例
void reference_style(Position &p, int i) {printf("reference_style:%d(%d,%d)\n", i, p._x, p._y);p._x = 300;
}int main() {Position p(1, 2);/*** 1、使用類的成員函數作為子線程的參數* 參數說明://參數1是成員函數的指針,參數2是Position對象值傳遞,* 子線程中對p的修改不會影響主線程中的對象p。*/thread t1(&Position::member_func, p, 233);t1.join();cout << "p.x=" << p.x() << endl;/*** 2、使用類的友元函數作為參數* 友元函數參見:https://blog.csdn.net/mary19920410/article/details/70036878* 參數說明:參數1是Position的友元函數reference_style,參數2是用ref包裝過的引用,* 參數3是傳給reference_style函數的值。* 在這種方式中,由于p是以引用的方式傳遞給子線程,在子線程中對p的修改相當于修改主線程中的p。*/std::thread t2(reference_style, ref(p), 1);t2.join();cout << "p.x=" << p.x() << endl;/*** 3、使用類的友元函數作為參數* 參數說明:參數1是Position的友元函數pointer_style,參數2是p的指針,參數3是傳給* pointer_style的參數。* 在這種方式中,由于p是以引用的方式傳遞給子線程,在子線程中對p的修改相當于修改主線程中的p。*/std::thread t3(pointer_style, &p, 1);t3.join();cout << "p.x=" << p.x() << endl;/*** 4、通過lambda傳遞引用參數* 關于lambda函數的說明:https://blog.csdn.net/u010984552/article/details/53634513*/auto lambda_func = [&p](int i) -> void {printf("lambda_func:%d(%d,%d)\n", i, p.x(), p.y());p.x() = 400;};/*** 參數說明:參數1是lambda表達式,參數2是傳遞給lambda表達式的參數* 由于在lambda_func是以引用的方式捕獲p,所以在子線程中p是主線程中p的引用,在子線程中修改p* 相當于主線程修改主縣城中的p。也可以以值傳遞的方式捕獲p,這樣在子線程中修改p就不會影響到主* 線程中的p。*/thread t4(lambda_func, 123);t4.join();cout << "p.x=" << p.x() << endl;return 0;
}
三、類內使用多線程,訪問類的成員
這種方法是把lambda函數(參考鏈接)作為線程參數,使用lambda函數捕獲類的成員函數及屬性,然后就可以在類內使用多線程。
#include <iostream>
#include <thread>
#include <vector>
using namespace std;class M{
private:vector<int> numbers;vector<thread> ts;
public:/*** 構造函數* @param thread_count 線程數量*/M(const int thread_count){numbers.resize(thread_count); // 調整數字容量//! 定義lambda函數,捕獲類的成員和變量,作為thread的參數,//! 這樣,就可以在子線程里訪問類的成員。auto lambda_fun = [&](int i) -> void {this->numbers[i] = i;for(int j=0;j<10000;j++);};//! 創建線程for(int i=0;i<thread_count;i++){ts.push_back(thread(lambda_fun,i));}//! 等待子線程結束for(int i=0;i<thread_count;i++){ts[i].join();}//! 打印結果for(int i=0;i<thread_count;i++){printf("numbers[%d]=%d\n", i, this->numbers[i]);}}
};int main(){M m(12);return 0;
}
?
總結
以上是生活随笔為你收集整理的C 多线程编程之在类中使用多线程(thread)的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中关于[]静态数组和new分配的动
- 下一篇: CSR稀疏矩阵存储方式