C++多线程获取指针类型的返回值

叶落无痕0826 2017-01-13 09:12:43
最近做一个项目,需要获取多线程的返回值,并且是指针类型的,请问各位大神该怎么做?
...全文
708 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yes-hyh 2017-01-16
  • 打赏
  • 举报
回复
直接返回不就行了吗,linux的话外部用pthread_join获取,,只是你返回的指针指向的地址不要是栈空间就OK。pthread_join获取后,便可使用,若是new的堆上空间,用完后记得delete就ok了撒
yes-hyh 2017-01-16
  • 打赏
  • 举报
回复
引用 2 楼 heyuhang112 的回复:
直接返回不就行了吗,linux的话外部用pthread_join获取,,只是你返回的指针指向的地址不要是栈空间就OK。pthread_join获取后,便可使用,若是new的堆上空间,用完后记得delete就ok了撒
对于windows的话,线程函数的返回值类型为DWORD,32位程序地址还够用,64位就不够用了。这时可以搞一个全局指针变量(若是多个线程,可以用map<线程ID,指针>,只是这样的话注意互斥)。然后线程结束后,将返回值存到这个全局指针变量,外部调用WaitForMultipleObjects等待线程结束后,从这个全局指针取值即可。也要注意指针指向的内存不能为栈空间。必须是全局数据空间、或者是堆空间。
FD_2013 2017-01-14
  • 打赏
  • 举报
回复
什么叫获取多线程的返回值。。。而且是指针类型的。。。不懂 如果是创建的windows自带的线程,那么一切与线程的数据交互都是通过,线程后面的参数param进行传递的,没法获取返回值呢,如果是你自己的业务里面时刻判断线程执行的结果,那就只能自己重新封装一个线程类了呢,线程开启关闭封装好,然后具体的业务操作放到线程里面,不知道懂不懂。。。。 算了,贴个代码吧:

// MyThread.h
#ifndef MY_THREAD_H
#define MY_THREAD_H

class CMyThread
{
public:
 CMyThread();
 virtual ~CMyThread();
 BOOL Start(LPVOID lpParam);
 BOOL End();
 virtual int Run();
protected:
 static DWORD WINAPI Thread(LPVOID lpParam);
 void RunOnceEnd();
 DWORD m_dwWaitTimeOut;
 BOOL m_bExitThread;
 HANDLE m_hTrd;
 LPVOID m_lpParam;
};
#endif
// MyThread.Cpp
#include "stdafx.h"
#include "MyThread.h"
/////////////////////////////////////////////////////////////////////////////
// CMyThread
CMyThread::CMyThread()
{
 m_bExitThread = FALSE;
 m_hTrd = NULL;
 m_dwWaitTimeOut = 5000;
}
CMyThread::~CMyThread()
{
}
BOOL CMyThread::Start(LPVOID lpParam)
{
 m_lpParam = lpParam;
 m_bExitThread = FALSE;
 m_hTrd = CreateThread(NULL, 0, Thread, this, 0, NULL);
 return TRUE;
}
BOOL CMyThread::End()
{
 m_bExitThread = TRUE;
 if(m_hTrd != NULL)
 {
  DWORD dwRet = WaitForSingleObject(m_hTrd, m_dwWaitTimeOut);
  if(dwRet == WAIT_OBJECT_0)
  {
   AfxMessageBox("Thread exit success!");
  }
  else
  {
   DWORD dwRet = 0;
   GetExitCodeThread(m_hTrd, &dwRet);
   TerminateThread(m_hTrd, dwRet);
   AfxMessageBox("Thread fucking exit!");
  }
  CloseHandle(m_hTrd);
  m_hTrd = NULL;
 }
 
 return TRUE;
}
DWORD WINAPI CMyThread::Thread(LPVOID lpParam)
{
 CMyThread *pTrd = (CMyThread *)lpParam;
 
 while(!pTrd->m_bExitThread)
 {
  pTrd->Run();
 }
 return 0;
}
void CMyThread::RunOnceEnd()
{
 m_bExitThread = TRUE;
 CloseHandle(m_hTrd);
 m_hTrd = NULL;
}
int CMyThread::Run()
{
}
///我们需要写我们自己的线程的时候就重载一下这个Run函数
// 派生出一个类
class CMyThread1 : public CMyThread
{
public:
 virtual int Run();
};

// 改写Run函数
int CMyThread1::Run()
{
 CTestThreadDlg *pDlg = (CTestThreadDlg *)m_lpParam;
 OutputDebugString("222");
 
 pDlg->m_csForVec.Lock();
 pDlg->m_vecTest.push_back("222");
 pDlg->m_csForVec.Unlock(); 
 
 Sleep(10);
 // 如果此线程只想运行一次,加上下面这句
 RunOnceEnd();
 return 0;
}

///然后我们之前的两个线程的使用就变成了下面的形式:

CMyThread1 g_t1, g_t2, g_t3;
void CTestThreadDlg::OnButton3()
{
 g_t1.Start(this);
 g_t2.Start(this);
 g_t3.Start(this); 
}

void CTestThreadDlg::OnButton4()
{
 g_t1.End();
 g_t2.End();
 g_t3.End();  
}
这个线程类是在MFC环境下的,可以参考实现你自己的业务,如果还是不能满足你的话,那就只能建议你使用开源框架开源库里封装好的线程类了。。 推荐两个 ACE框架的线程封装使用,如果闲ACE用起来不得劲,那就用boost库里的吧,boost里对线程的封装还是有点厉害的

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧