BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #5337同步于 2008/4/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

关于多线程访问请教大牛

kangkai810
2008/4/19镜像同步4 回复
#include <stdio.h> #include <windows.h> HANDLE hThread_1; //定义一个全局变量为线程1的句柄 DWORD WINAPI FirstThread(PVOID pParam); //线程函数1 DWORD WINAPI SecondThread(PVOID pParam); //线程函数2 int main() { DWORD dwFirstThreadId; hThread_1 = CreateThread(NULL, 0, FirstThread, NULL, 0, &dwFirstThreadId); WaitForSingleObject(hThread_1,INFINITE); //等待线程1执行结束 return 1; } DWORD WINAPI FirstThread(PVOID pParam) { int x; printf("Start:&x:%p\n",&x); x=0; DWORD dwSecondThreadId; HANDLE hThread_2; //定义线程2句柄 hThread_2=CreateThread(NULL, //创建线程2 0, SecondThread, (PVOID)&x, //将线程1堆栈上的变量传给线程2 0, & dwSecondThreadId); CloseHandle(hThread_1); //在线程1中调用closehandle来释放线程1的资源,此时线程1的堆栈被破坏 WaitForSingleObject(hThread_2,INFINITE); return 1; } DWORD WINAPI SecondThread(PVOID pParam) { *((int*)pParam)=5; //在线程2中访问线程一堆栈上的变量 printf("x:%d \n", *((int*)pParam)); return 1; } 为什么我在函数FirstThread中已经用CloseHandl将线程1的堆栈破坏,为什么线程2还是可以访问线程1堆栈上的变量?而不会产生内存访问错误?
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
hokkien机器人#1 · 2008/4/19
CloseHandle(hThread_1); //在线程1中调用closehandle来释放线程1的资源,此时线程1的堆栈被破坏 ///////////////////////////////////// 这个理解有点问题。closehandle调用,并不一定能保证一定释放资源,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。也就是说,此时的资源并没有被释放,因为还有线程需要使用资源
flyingmiao机器人#2 · 2008/4/20
不懂WINAPI的菜鸟路过
kangkai810机器人#3 · 2008/4/20
【 在 hokkien 的大作中提到: 】 : CloseHandle(hThread_1); //在线程1中调用closehandle来释放线程1的资源,此时线程1的堆栈被破坏 : ///////////////////////////////////// : 这个理解有点问题。closehandle调用,并不一定能保证一定释放资源,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。也就是说,此时的资源并没有被释放,因为还有线程需要使用资源 您的意思是不是只有当内核对象的计数器唯一时,资源才会被释放,除此之外调用CloseHandle不会释放资源?
guo机器人#4 · 2008/4/20
re一楼 MSDN上说: CloseHandle invalidates the specified object handle, decrements the object's handle count, and performs object retention checks. After the last handle to an object is closed, the object is removed from the system. Closing a thread handle does not terminate the associated thread. To remove a thread object, you must terminate the thread, then close all handles to the thread.