//子线程报数
#include<stdio.h>
#include<process.h>
#include<windows.h>
intg_nCount;
//子线程函数
unsignedint__stdcallThreadFun(PVOIDpM)
{
g_nCount++;
printf("线程ID号为%4d的子线程报数%d\n",GetCurrentThreadId(),g_nCount);
return0;
}
//主函数,所谓主函数其实就是主线程执行的函数。
intmain()
{
printf("子线程报数\n");
printf("--byMoreWindows()--\n\n");
constintTHREAD_NUM=10;
HANDLEhandle[THREAD_NUM];
g_nCount=0;
for(inti=0;i<THREAD_NUM;i++)
handle[i]=(HANDLE)_beginthreadex(NULL,0,ThreadFun,NULL,0,NULL);
WaitForMultipleObjects(THREAD_NUM,handle,TRUE,INFINITE);
return0;
}
对一次运行结果截图如下:

显示结果从1数到10,看起来好象没有问题。
秒杀多线程第三篇 原子操作 Interlocked系列函数
程序中模拟的是10个用户登录,程序将输出结果:

#include<stdio.h>
#include<windows.h>
volatilelongg_nLoginCount;//登录次数
unsignedint__stdcallFun(void*pPM);//线程函数
constDWORDTHREAD_NUM=50;//启动线程数
DWORDWINAPIThreadFun(void*pPM)
{
Sleep(100);//someworkshouldtodo
g_nLoginCount++;
Sleep(50);
return0;
}
intmain()
{
printf("原子操作Interlocked系列函数的使用\n");
printf("--byMoreWindows()--\n\n");
//重复20次以便观察多线程访问同一资源时导致的冲突
intnum=20;
while(num--)
{
g_nLoginCount=0;
inti;
HANDLEhandle[THREAD_NUM];
for(i=0;i<THREAD_NUM;i++)
handle[i]=CreateThread(NULL,0,ThreadFun,NULL,0,NULL);
WaitForMultipleObjects(THREAD_NUM,handle,TRUE,INFINITE);
printf("有%d个用户登录后记录结果是%d\n",THREAD_NUM,g_nLoginCount);
}
return0;
}
运行结果如下图:

现在结果水落石出,明明有50个线程执行了g_nLoginCount++;操作,但结果输出是不确定的,有可能为50,但也有可能小于50。
要解决这个问题,我们就分析下g_nLoginCount++;操作。在VC6.0编译器对g_nLoginCount++;这一语句打个断点,再按F5进入调试状态,然后按下Debug工具栏的Disassembly按钮,这样就出现了汇编代码窗口。可以发现在C/C++语言中一条简单的自增语句其实是由三条汇编代码组成的,如下图所示。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33747-6.html
怎么也没法输入