• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
经典 线程数据传递 类 指针 变量

多线程数据传递

指针代表数据的地址

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;
}

  

posted on 2022-11-18 19:15  MKT-porter  阅读(84)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3