Re: 多线程的奇怪问题
CPU架构
多线程的奇怪问题
windbgger
2013-03-13, 11:05 上午
有如下两个线程,线程间没有互斥的访问一个变量。
起初我决的可能出现的结果为4,5,6
但是,把程序稍微改了一下(见附件)以验证我的猜测,结果出乎意料,
实际运行可能结果如下:
-6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6
运行环境:WIN7 x64
求大师解答!!!!!!
-----------------------------------------------------------------------
#include <stdio.h>
#include <process.h>
#include <windows.h>
INT64 n = 5;
void thread1(PVOID param)
{
n++;
}
void thread2(PVOID param)
{
n--;
}
void main() {
HANDLE handle[2]={0};
handle[0] = (HANDLE)_beginthread(thread1,0,NULL);
handle[1] = (HANDLE)_beginthread(thread2,0,NULL);
WaitForMultipleObjects(2,handle,TRUE,INFINITE);
printf("n=%d\n",n);
getchar();
return;
}
----------------------------------------------------------------------
Re: 多线程的奇怪问题
windbgger
2013-03-13, 11:25 上午
附件怎么没有了,再发。
Re: 多线程的奇怪问题
windbgger
2013-03-13, 11:27 上午
不好意思,第一次发帖
Re: 多线程的奇怪问题
windbgger
2013-03-13, 13:09 下午
#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
Re: 多线程的奇怪问题
windbgger
2013-03-14, 11:34 上午
忘了说了,运行的机器是Intel四核处理器,型号如下
Intel Core2 Quad Q6600 2.4GHz
这个问题百思不得其解, 怀疑与多和处理器有关,但不知道原因。
请教张老师和各位高手。
Re: 多线程的奇怪问题
windbgger
2013-03-14, 11:47 上午
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
Re: 多线程的奇怪问题
格蠹老雷
2013-03-18, 21:31 下午
草草看了一下,没能理解楼主的意思,能解释一下到底觉得啥地方不正常呢?
test!n的值突然变成奇怪的值,如0,-1,3之类。
是上面这句么?是另外一个线程在修改啊