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)
         {
            resultNo [N]++;
         }
         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, resultIdea [I]);
  }

  for(ULONG i=0;i<sizeof(result2)/sizeof(LONG);i++)
  {
     printf("result2[%d] = %d\n", i, result2Idea [I]);
  }
}

其中一次的运行结果如下
result[0] = 2
result[1] = 1
result[2] = 2
result[3] = 2
result[4] = 5
result[5] = 9890
resultDevil [6] = 91
result[7] = 0
resultMusic [8] = 0
result[9] = 0
result2[0] = -1
result2[1] = -2
result2[2] = -2
result2[3] = -4
result2[4] = -4
result2[5] = -5
result2Devil [6] = -6
result2[7] = 0
result2Music [8] = 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之类。

是上面这句么?是另外一个线程在修改啊

Powered by Community Server Powered by CnForums.Net