createthread不运行
#include#include
#pragma comment(lib,"ws2_32.lib")
#include
//#define NULL 0
DWORD WINAPI SumThread(LPVOID lp)//求和线程
{
int* sum=(int*)lp;
for(int i=1;i<101;i++)
{
(*sum)+=i;
}
return 0;//线程返回
}
DWORD WINAPI MulThread(LPVOID lp)//求阶乘线程
{
int* mul=(int*)lp;
for(int i=1;i<11;i++)
{
(*mul)*=i;
}
return 0;
}
DWORD WINAPI PrintThread(LPVOID lp)//打印线程
{
HANDLE handle ;
int sum=0 ;
int mul=1;
handle = CreateThread(NULL,0,SumThread,(LPVOID*)sum,0,NULL);//创建求和线程
CloseHandle(handle);//关闭线程句柄
handle = CreateThread(NULL,0,MulThread,(LPVOID*)mul,0,NULL);//创建求阶乘线程
CloseHandle(handle);//关闭线程句柄
printf("%d",sum);//打印和
printf("%d",mul);//打印阶乘
return 0;
}
int main()
{
HANDLE handle;
handle = CreateThread(NULL,0,PrintThread,NULL,0,NULL);
CloseHandle(handle);
return 0;
}
麻烦看下为什么运行后子线程不执行
handle = CreateThread(NULL,0,SumThread,(LPVOID*)(∑),0,NULL);//创建求和线程
CloseHandle(handle);//关闭线程句柄
handle = CreateThread(NULL,0,MulThread,(LPVOID*)(&mul),0,NULL);//创建求阶乘线程
createthread和beginthread的区别?
CreateThread和beginthread是用于在Windows操作系统中创建线程的不同函数。它们之间的主要区别如下:
1. 函数参数:CreateThread是Windows API函数,它的原型是CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId)。其中,lpStartAddress参数是一个线程函数的指针,表示新线程将从何处开始执行。而beginthread是C运行时库函数,它的原型是unsigned int _beginthread(void(*start_address)(void *), unsigned int stack_size, void *arglist)。其中,start_address参数是一个返回值为void的函数指针,表示新线程将从何处开始执行。
2. 返回值:CreateThread函数返回一个指向新线程的句柄,以便后续操作对该线程进行控制和管理。而beginthread函数返回一个线程标识符(thread ID),用于在后续操作中唯一标识该线程。请注意,beginthread函数返回的线程ID是一个无符号整数,而CreateThread返回的是一个句柄。
3. 执行环境:CreateThread函数可以在Windows系统的任何线程上下文中调用,而beginthread函数必须在已初始化C运行时库(CRT)的环境中调用。
4. 内存管理:使用CreateThread函数创建的线程需要自行负责分配和释放堆栈空间。而beginthread函数使用CRT提供的内存管理功能,自动分配和释放堆栈空间。
总的来说,CreateThread函数提供了更多的灵活性和细粒度的线程控制选项,但需要开发人员自行管理线程的堆栈和其他资源。而beginthread函数是一个较为简化的接口,对于常见的线程创建场景提供了便利,特别适用于C/C++程序。此外,beginthread函数还与CRT的初始化和内存管理紧密结合。
需要注意的是,beginthread函数在较新版本的CRT中已经被标记为过时(deprecated),建议使用更现代的多线程函数接口,如CreateThread。
希望这些信息能对您有所帮助!
分享相关内容的知识扩展阅读:
请问高手我的电脑蓝屏后出显stop:0x0000007e(0xc000001d,0x808a4108,0xf893dca4,0xf893d9a0)是什么问题
重起后正常,过一段时间又会出现这种情况. 打开网页经常出现内存不能为“read”然后强行关闭.Windows XP 0x0000007E未知原因蓝屏的处理
新的兼容机做系统,用以前精心做好的XP系统克隆,死活蓝屏。 今天想修复安装一下,结果还是不行。出错 STOP 0x0000007E 没有指出详细模块,但安全模式能进。
排除了内存原因,基本就是驱动问题。 于是卸载驱动,停服务,删文件,看日志...均告败。
从下午折腾到晚上。
换了1台机子、查资料最后找windbg ,升级 ,找symbols,找com对接线 最后终于搞定。
闹了半天是处理器驱动搞怪!ft 一直以为是主板或者显卡驱动问题...
----------
蓝屏的原因基本介绍我就不说了,总结一下这次蓝屏情况的处理:
微软对0x0000007E解释的原因有这几种:
• 如果在 Windows 安装过程中之一次重新启动后或在安装完成后出现此问题,则可能是计算机没有足够的硬盘空间来运行 Windows。
• 如果在 Windows 安装过程中之一次重新启动后或在安装完成后出现此问题,可能是计算机的 BIOS 与 Windows 不兼容。
• 视频适配器驱动程序不兼容。
• RAM 已损坏。
• 设备驱动程序或系统服务损坏。
• 如果问题与 Win32k.sys 文件相关联,则此问题可能是由第三方远程控制程序导致的。
1 首先 排除硬件原因: 换内存,不超频,如果有一样的机子可以换着试一下...
2 排除显卡问题: 由于这个是集成显卡,新装的XP是可以用的,所以只能怀疑驱动。 进安全模式卸载显卡驱动,甚至删除以前的显卡驱动程序文件
3 排除主板驱动问题: 进安全模式,卸载所有系统相关的驱动...
4 关闭系统服务: 可以在安全模式使用msconfig关闭,或者在系统恢复控制台中使用listsvc和disable来关闭服务
5 均不凑效的情况下,只能做系统调试试试了。
总结Windbg确定蓝屏原因的步骤:
准备: Windbg,Symbols File,Com对接线。
蓝屏情况一般使用Windbg来调试,Windbg是Debuging Tools for Windows ,微软出的调试工具。
Windbg可从http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx 下载。目前最新版本是6.5.003.7
调试需要使用对应Windows的符号文件,这个也在上面地址下载。一百多兆,要有点耐心。
Windbg类似于SoftICE非常强大,但这次我们使用的非常简单。
由于蓝屏机器无响应,我们只能通过另外一台计算机进行调试。
准备一根Com对接线,就是两个头都是母头的RS232线,用来连接两台计算机的Com口。 如果找不到,可以使用两个DB9-RJ45的转换头,中间使用双绞线全反连接(就是1-8对应对面的8-1)。这个做 *** 的用的比较多。
之一步:东西准备好后,在正常的计算机上安装 Windbg,Windows XP SP2(和蓝屏机器系统对应)的符号文件(Symbols),注意要在windbg中File菜单配置Symbols Path,要到具体pdb文件目录,比如“C:\XPSymbols\sys;C:\XPSymbols\dll;”要把常用的文件dll,sys,exe等都加上去。然后使用Com对接线将两台计算机的Com1口连接起来。
第二步: 修改蓝屏机子的启动文件boot.ini, 在启动参数中加入 /debug /debugport=com1 /baudrate=115200
比如: multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows XP Professional " /fastdetect /NoExecute=OptIn /debug /debugport=com1 /baudrate=115200
第三步: 在调试机上命令提示符下进入Windbg安装目录,键入 “windbg -k comort=com1,baud=115200 ”,启动Windbg。 或者建立快捷方式将后面的参数带进去。
正常情况下蓝屏机器开始启动Windows后Windbg就会有显示。
Windbg很聪明,一启动,就直接告诉你机器出现系统Exception(信息当时没有拷贝),symbols配好了以后, 起来就提示“Probably caused by : intelppm.sys ( intelppm!ReadMSR+c )”
闹了半天是处理器驱动搞怪!
第四步: 进一步使用 *** yze –v来分析。 这是分析蓝屏最直接的命令。
*** yze -v 结果
[code:4096fdb5c0]kd> ! *** yze -v
*******************************************************************************
* *
* Bugcheck Analysis *
* *
*******************************************************************************
SYSTEM_THREAD_EXCEPTION_NOT_HANDLED (7e)
This is a very common bugcheck. Usually the exception address pinpoints
the driver/function that caused the problem. Always note this address
as well as the link date of the driver/image that contains this address.
Arguments:
Arg1: c0000005, The exception code that was not handled
Arg2: fac41750, The address that the exception occurred at
Arg3: fafb4430, Exception Record Address
Arg4: fafb412c, Context Record Address
FAULTING_MODULE: 804d8000 nt
DEBUG_FLR_IMAGE_TIMESTAMP: 41107b37
EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - "0x%08lx"
FAULTING_IP:
intelppm!ReadMSR+c
fac41750 0f32 rdmsr
EXCEPTION_RECORD: fafb4430 -- (.exr fffffffffafb4430)
ExceptionAddress: fac41750 (intelppm!ReadMSR+0x0000000c)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 0
CONTEXT: fafb412c -- (.cxr fffffffffafb412c)
eax=00000f00 ebx=00000000 ecx=0000002c edx=00000000 esi=00000000 edi=00000001
eip=fac41750 esp=fafb44f8 ebp=fafb4500 iopl=0 nv up ei pl zr na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010246
intelppm!ReadMSR+0xc:
fac41750 0f32 rdmsr
Resetting default scope
DEFAULT_BUCKET_ID: DRIVER_FAULT
BUGCHECK_STR: 0x7E
LAST_CONTROL_TRANSFER: from fac413f6 to fac41750
STACK_TEXT:
fafb4500 fac413f6 0000002c 00000f00 00000f00 intelppm!ReadMSR+0xc
fafb4514 fac41469 00020fc2 078bfbff fafb4570 intelppm!IsP4ProcSpeedStepCapable+0xe
fafb4524 fac414a1 fac43db1 fac43c94 00000001 intelppm!IsProcPStateCapable+0x41
fafb4528 fac43db1 fac43c94 00000001 fac46b1c intelppm!ValidateProcessorCapabilities+0x5
fafb4534 fac46b1c fac439e0 ffbc5820 e195b382 intelppm!InitializeDriver+0x2b
fafb4570 80576548 ffbc5820 fec73000 e18e2a80 intelppm!DriverEntry+0x18c
WARNING: Stack unwind information not available. Following frames may be wrong.
fafb4640 80689770 00000ae0 00000001 00000000 nt!NtWriteFile+0x44a8
fafb469c 80686ad9 00043000 00000000 00000000 nt!IoReportHalResourceUsage+0x172a
fafb483c 80684edd 80084000 00000000 8130cb28 nt!NlsOemLeadByteInfo+0x15c5d
fafb4dac 805c5a06 80084000 00000000 00000000 nt!NlsOemLeadByteInfo+0x14061
fafb4ddc 80541fa2 80684528 80084000 00000000 nt!PsRemoveCreateThreadNotifyRoutine+0x21e
00000000 00000000 00000000 00000000 00000000 nt!KiDispatchInterrupt+0x5a2
FOLLOWUP_IP:
intelppm!ReadMSR+c
fac41750 0f32 rdmsr
SYMBOL_STACK_INDEX: 0
FOLLOWUP_NAME: MachineOwner
SYMBOL_NAME: intelppm!ReadMSR+c
MODULE_NAME: intelppm
IMAGE_NAME: intelppm.sys
STACK_COMMAND: .cxr fffffffffafb412c ; kb
BUCKET_ID: WRONG_SYMBOLS
Followup: MachineOwner[/code:4096fdb5c0]
我们可以通过当前异常所在的模块看到是哪个驱动引起的异常。Stack可以看出来调用情况。 这里面可以清楚地看出来是ReadMSR指令引起的异常,是Intelppm.sys文件。 查这个文件的属性,知道这是Intel处理器的驱动。 兼容机是Sempron的CPU,当然不支持MSR的指令了! 折腾了半天居然是这个低级错误…
第五步:修复起来就出奇地简单了,把Intelppm.sys改名或者删除都可以。重起,一切正常!
总结
Windows蓝屏目前出的不多了,但是个别时候碰见也的确是非常让人心烦。确定蓝屏的原因对于解决非常重要。 在不能简单确定原因的情况下,就需要用到系统调试功能了。这个工作使用Windbg最合适不过了。
上面说了一下未知异常0x0000007E蓝屏的处理以及Windbg来确定原因的步骤,希望对大家有所启发.
URL:
https://www.d4e.org/showthread.php?t=80799
kthread 一个内核线程栈有多大
以下内容摘自《秒杀多线程第二篇 多线程之一次亲密接触 CreateThread与_beginthreadex本质区别》之一个 CreateThread
函数功能:创建线程
函数原型:
HANDLEWINAPICreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttributes,
SIZE_TdwStackSize,
LPTHREAD_START_ROUTINElpStartAddress,
LPVOIDlpParameter,
DWORDdwCreationFlags,
LPDWORDlpThreadId
);
函数说明:
之一个参数表示线程内核对象的安全属性,一般传入NULL表示使用默认设置。
第二个参数表示线程栈空间大小。传入0表示使用默认大小(1MB)。
求高人指点,beginthread函数怎么调用类内成员函数
HANDLE hThread0=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread,&m_prog,0,NULL);CloseHandle(hThread0);
CloseHandle(hThread1);)
Sleep(100);
}
DWORD WINAPI ListenThreadFunc(LPVOID lpParameter)
{
CTestDlg *pDlg=(CTestDlg *)lpParameter;//把传过来的参数再强制转换回CTestDlg *类型
pDlg->GetDlgItem(IDC_EDIT1)->SetWindowText("abc");//就可以了
}