|
|
|
|
|
|
|
CPU架构
帖子发起人: windbgger 发起时间: 2013-03-13 11:05 上午 回复: 6
|
帖子排序:
|
|
|
|
2013-03-13, 11:25 上午
|
windbgger
注册: 2013-03-13
发 贴: 6
|
|
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2013-03-13, 11:27 上午
|
windbgger
注册: 2013-03-13
发 贴: 6
|
|
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2013-03-13, 13:09 下午
|
windbgger
注册: 2013-03-13
发 贴: 6
|
|
|
#include <stdio.h> #include <process.h> #include <windows.h> LONG n = 5; void thread1(PVOID param) { Sleep(*(ULONG *)param); n++; } void thread2(PVOID param) { Sleep(*(ULONG *)param); n--; } void main() { HANDLE handle[2]={0}; ULONG result[10]={0}; LONG result2[10]={0}; int index = 0; for(ULONG i=0;i<100;i++) { for(ULONG j=0;j<100;j++) { n = 5; handle[0] = (HANDLE)_beginthread(thread1,0,&i); handle[1] = (HANDLE)_beginthread(thread2,0,&j); WaitForMultipleObjects(2,handle,TRUE,INFINITE); if(0<=n && n<10) { result ++; } else { result2[index] = n; index++; } printf("i=%4d,j=%4d\n",i,j); } } for(ULONG i=0;i<sizeof(result)/sizeof(ULONG);i++) { printf("result[%d] = %d\n", i, result ); } for(ULONG i=0;i<sizeof(result2)/sizeof(LONG);i++) { printf("result2[%d] = %d\n", i, result2 ); } } 其中一次的运行结果如下 result[0] = 2 result[1] = 1 result[2] = 2 result[3] = 2 result[4] = 5 result[5] = 9890 result = 91 result[7] = 0 result = 0 result[9] = 0 result2[0] = -1 result2[1] = -2 result2[2] = -2 result2[3] = -4 result2[4] = -4 result2[5] = -5 result2 = -6 result2[7] = 0 result2 = 0 result2[9] = 0
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2013-03-14, 11:47 上午
|
windbgger
注册: 2013-03-13
发 贴: 6
|
|
|
0:001> uf thread1 8 00000001`40001030 48894c2408 mov qword ptr [rsp+8],rcx 8 00000001`40001035 4883ec28 sub rsp,28h 9 00000001`40001039 488b442430 mov rax,qword ptr [rsp+30h] 9 00000001`4000103e 8b08 mov ecx,dword ptr [rax] 9 00000001`40001040 ff15aa540300 call qword ptr [test!_imp_Sleep (00000001`400364f0)] 10 00000001`40001046 8b05bcdf0200 mov eax,dword ptr [test!n (00000001`4002f008)] ~~~~~~~~~~~~~~~~~~~~~~ 在这一步之前, test!n的值突然变成奇怪的值,如0,-1,3之类。 但这样的值产生好像不是程序改变的, 因为硬件断点从来没有在两个线程的
“mov dword ptr [test!n (00000001`4002f008)],eax”这句指令以外的点断下来过。 10 00000001`4000104c 83c001 add eax,1 10 00000001`4000104f 8905b3df0200 mov dword ptr [test!n (00000001`4002f008)],eax 11 00000001`40001055 4883c428 add rsp,28h 11 00000001`40001059 c3 ret
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2013-03-18, 21:31 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
草草看了一下,没能理解楼主的意思,能解释一下到底觉得啥地方不正常呢?
test!n的值突然变成奇怪的值,如0,-1,3之类。
是上面这句么?是另外一个线程在修改啊
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 系统架构 » CPU架构 » Re: 多线程的奇怪问题
|
|
|
|
|
|