多线程数据传递
指针代表数据的地址
1搞一个类的指针,送给线程参数,
2主进程更新类的数据
3在线程里面通过指针来获取 类,然后进一步获取类的数据
从而完成多线程,通过指针+类数据传播。
4 注意加锁机制。修改数据前,要对数据枷锁,防止多线程同时操作数据。
编译

进入 build文件
cmake ..
make
文件
CMakeLists.txt
# 父目录下的CMakeLists.txt
cmake_minimum_required(VERSION 3.10.2)
project(test)
find_package(Threads)
#1手动设置指定文件
set(Current_LIST main.cpp )
#set(SRC_LIST src/API_Cout.cpp) #不需要指定头文件
#2自动搜所文件目录
#aux_source_directory(. Current_LIST) # 搜索当前.目录下的所有.cpp文件
#aux_source_directory(./src SRC_LIST) # 搜索src目录下的所有.cpp文件
#add_executable(demo ${Current_LIST} ${SRC_LIST})
add_executable(demo ${Current_LIST} )
#target_link_libraries (demo ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries (demo pthread)

main.cpp
//#include "src/API_Cout.h"
#include <iostream>
#include <thread>
#include <unistd.h> //usleep(1000000);
using namespace std;
class ShareData{
private :
int count;
public:
ShareData(){std::cout << "创建成功"<< std::endl;};
~ShareData(){std::cout << "销毁成功"<< std::endl;};
void Intial();
void Add(int addnum);
int GetCout();
};
void ShareData::Intial(void){
count=1;
}
void ShareData::Add(int addnum){
count=count+addnum;
}
int ShareData::GetCout(){
return count;
}
// 2-1 const 只能引用 不能修改 不然报错
void fuc_nomarl(const int &x,char *mychar)
{
std::cout << &x << " " << &mychar << std::endl;
std::cout << "正在运行的线程为:" << std::this_thread::get_id() << " 线程的参数为: " << x <<" "<<mychar<< std::endl;
return;
}
// 2-2 指针传递参数
void fuc_ptr_use(int *x)
{
int cout=0;
while (cout<10){
cout++;
usleep(1000000);
std::cout << "线程:" << std::this_thread::get_id() << " 线程的参数为: " << *x <<" "<< std::endl;
}
}
//3-1 类整体拷贝模式
void fuc_class_copy(ShareData x)
{
int cout=0;
while (cout<10){
cout++;
usleep(1000000);
std::cout << "线程:" << std::this_thread::get_id() << " 线程的参数为: " << x.GetCout() <<" "<< std::endl;
}
}
//3-2 类指针传递参数 直接引用模式
void fuc_ptr_calss_use(ShareData *x)
{
int cout=0;
while (cout<10){
cout++;
usleep(1000000);
std::cout << "线程:" << std::this_thread::get_id() << " 线程的参数为: " << x->GetCout() <<" "<< std::endl;
}
}
int main(int argc, char** argv)
{
// 1 类的主函数调用
ShareData class_test1;
int count_=0;
class_test1.Intial();
count_=class_test1.GetCout();
cout<< count_ <<endl;
class_test1.Add(3);
std::cout << "class_test1.Add(3)" << std::endl;
count_=class_test1.GetCout();
cout<< count_ <<endl;
// 2-1 线程参数传递 变量直接拷贝传递
int x = 1;
char mybuff[] = "This is a test";
std::cout << &x << " " << &mybuff << std::endl;
std::thread thread21_(fuc_nomarl, x, mybuff);
//2-2 线程参数传递 指针传递
// 直接引用
int *xptr;
xptr=&x;
//std::thread thread22_(fuc_ptr_use, xptr);
//3-1 类的线程参数传递 直接拷贝
// 浅拷贝
//std::thread thread31_(fuc_class_copy, class_test1);
//3-2 类的线程参数传递 传递指针 直接引用类本身
ShareData *class_xptr;
class_xptr=&class_test1;
std::thread thread32_(fuc_ptr_calss_use, class_xptr);
while (1){
usleep(1000000);
class_test1.Add(3); //主线程 类变量递增
x++; //主线程 普通变量递增
//*xptr =*xptr+3;
count_=class_test1.GetCout();
cout<<"main thread :" <<count_ <<" " <<x << endl;
}
return 0;
}
浙公网安备 33010602011771号