#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <Windows.h> DWORD WINAPI print(void *p) { for (;;) { printf("按Enter键终止运行\n"); } return 0; } int main(int argc, char *argv[]) { int i = 0; HANDLE p = CreateThread(NULL, 0, print, NULL, 0, NULL); for (;;) { getchar(); TerminateThread(p, 0); } return 0; }
解决方案
3
将该值指针作为线程函数参数传递给线程函数,多看看msdn
5
要在线程中修改变量i的值,可以把i的指针传递到线程函数中,CreateThread的第四个参数就是用来传递东西的
5
线程启动的地方,那个函数中,局部变量的地址 可以传递给子线程
前提是,子线程要比这个函数结束的早
函数结束后,子线程中操作这个地址中的数据,就变成 对野指针进行操作了
还有一个办法是
函数中,动态分配数据,并初始化
而在在子线程中释放内存,不过,这样就不能改动主线程的函数中的数据了
除非二者共享动态分配数据的数据
共享数据,通常需要同步
前提是,子线程要比这个函数结束的早
函数结束后,子线程中操作这个地址中的数据,就变成 对野指针进行操作了
还有一个办法是
函数中,动态分配数据,并初始化
而在在子线程中释放内存,不过,这样就不能改动主线程的函数中的数据了
除非二者共享动态分配数据的数据
共享数据,通常需要同步
14
DWORD WINAPI print(void *p) { *(int*)p = 1; //这里修改主函数i for (;;) { printf("按Enter键终止运行\n"); } return 0; } int main(int argc, char *argv[]) { int i = 0; HANDLE p = CreateThread(NULL, 0, print, &i, 0, NULL); for (;;) { getchar(); TerminateThread(p, 0); } return 0; }