b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

windows c多线程_windows 多线程面试题_java多线程面试题编程(6)

电脑杂谈  发布时间:2017-02-21 22:25:22  来源:网络整理

//子线程报数

#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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 二十面相少女
      二十面相少女

      怎么也没法输入

    热点图片
    拼命载入中...