确保线程结束之前,传递给线程回调函数的参数的有效性
来源:互联网 发布:软件行业市场描述 编辑:程序博客网 时间:2024/06/13 02:55
最近在写一个我把它称为RemoteMedia的东西。其中,服务端程序要创建一个新的进程完成某些工作。而且,这个进程结束后,服务端还要通知客户端。
我所想到的方法是,创建这个进程后,保存进程的句柄值。为了及时获得进程的工作状况(是否退出、退出代码为多少)而又不阻塞服务端主线程的运行,我创建一个新的线程,并把这个句柄值作为线程回调函数的实参。按照自己初步想法写完后,满心欢喜去调试,结果出现了Access violation。
下面,请看这部分代码:
创建线程:
线程Routine:
错误很明显了吧!
因为我把一个栈上的对象作为线程回调函数的实参了,而我又没保证在线程结束之前这个对象是一直有效的,所以就出现了Access violation。
我所想到的方法是,创建这个进程后,保存进程的句柄值。为了及时获得进程的工作状况(是否退出、退出代码为多少)而又不阻塞服务端主线程的运行,我创建一个新的线程,并把这个句柄值作为线程回调函数的实参。按照自己初步想法写完后,满心欢喜去调试,结果出现了Access violation。
下面,请看这部分代码:
创建线程:
typedef struct _TidParms{ CMKVMerge *pMkvmerge; CRMSConnect *pSockConn;} TidParms, *PTidParms;void CMKVMerge::CreateMkvmergeStatChkTid(){ // ... TidParms parm; parm.pMkvmerge = this; parm.pSockConn = pSockConn; m_hChkMkvmergeTid = _beginthreadex(..., CheckIfMkvmergeExit, &parm, ...); // ...}
线程Routine:
UINT __stdcall CMKVMerge::CheckIfMkvmergeExit(LPVOID pParam){ PTidParms pTidParm = (PTidParms)pParam; ::WaitForSingleObject(pTidParm->pMkvmerge->GetRunningProcHandle(), INFINITE); DWORD dwMkvmergeExitCode; if (::GetExitCodeProcess(pTidParm->pMkvmerge->GetRunningProcHandle(), &dwMkvmergeExitCode)) { if (0 == dwMkvmergeExitCode) { // 通知客户端 } } pTidParm->pMkvmerge->CloseRunningProcHandle(); return EXIT_SUCCESS;}
错误很明显了吧!
因为我把一个栈上的对象作为线程回调函数的实参了,而我又没保证在线程结束之前这个对象是一直有效的,所以就出现了Access violation。
- 确保线程结束之前,传递给线程回调函数的参数的有效性
- c#给线程传递参数的方法
- pthread_create()给创建的线程传递参数
- CreateThread给线程函数传递的参数
- 检测委托线程的结束_通过等待句柄和回调函数
- 给线程传递参数
- 传递参数给线程
- 【VS开发】CreateThread给线程函数传递的参数
- 关于sqlite_exec回调函数中参数传递的问题
- javascript的回调函数里如何传递参数
- javascript的回调函数里如何传递参数
- 如何给$.ajax的回调函数传参数?
- 如何给Ajax的回调函数传参数?
- 线程间的参数传递
- 利用回调函数在线程和主类中传递消息
- 理解 CompletableFuture 的任务与回调函数的线程
- 回调函数 参数传递
- Linux线程创建以及回调函数的使用
- Linux 设置apache,mysql开机启动
- GNU nano使用简要说明
- 泛虚拟化技术(以Xen为例)
- UAP开发
- Paper Notes: Fast unfolding of communities in large networks
- 确保线程结束之前,传递给线程回调函数的参数的有效性
- CSS中opacity的使用
- archlinux 安装手札
- Java中的Enum的使用与分析
- 23. 特定领域语言
- 虚拟化技术未来发展趋势
- 安全联盟会不会成为个人站长的营销“利器”?
- BNU 26579 Andrew the Ant 【蚂蚁】
- leetcode 编辑距离