Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

CPU架构

帖子发起人: windbgger   发起时间: 2013-03-13 11:05 上午   回复: 6

Print Search
帖子排序:    
   2013-03-13, 11:05 上午
windbgger 离线,最后访问时间: 2013/3/13 3:56:34 windbgger

发帖数前200位
注册: 2013-03-13
发 贴: 6
多线程的奇怪问题
Reply Quote
有如下两个线程,线程间没有互斥的访问一个变量。
起初我决的可能出现的结果为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;

}
----------------------------------------------------------------------

IP 地址: 已记录   报告
   2013-03-13, 11:25 上午
windbgger 离线,最后访问时间: 2013/3/13 3:56:34 windbgger

发帖数前200位
注册: 2013-03-13
发 贴: 6
Re: 多线程的奇怪问题
Reply Quote
附件怎么没有了,再发。

IP 地址: 已记录   报告
   2013-03-13, 11:27 上午
windbgger 离线,最后访问时间: 2013/3/13 3:56:34 windbgger

发帖数前200位
注册: 2013-03-13
发 贴: 6
Re: 多线程的奇怪问题
Reply Quote
不好意思,第一次发帖

IP 地址: 已记录   报告
   2013-03-13, 13:09 下午
windbgger 离线,最后访问时间: 2013/3/13 3:56:34 windbgger

发帖数前200位
注册: 2013-03-13
发 贴: 6
Re: 多线程的奇怪问题
Reply Quote
#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

IP 地址: 已记录   报告
   2013-03-14, 11:34 上午
windbgger 离线,最后访问时间: 2013/3/13 3:56:34 windbgger

发帖数前200位
注册: 2013-03-13
发 贴: 6
Re: 多线程的奇怪问题
Reply Quote
忘了说了,运行的机器是Intel四核处理器,型号如下
Intel Core2 Quad Q6600 2.4GHz

这个问题百思不得其解, 怀疑与多和处理器有关,但不知道原因。
请教张老师和各位高手。

IP 地址: 已记录   报告
   2013-03-14, 11:47 上午
windbgger 离线,最后访问时间: 2013/3/13 3:56:34 windbgger

发帖数前200位
注册: 2013-03-13
发 贴: 6
Re: 多线程的奇怪问题
Reply Quote
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 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 多线程的奇怪问题
Reply Quote

草草看了一下,没能理解楼主的意思,能解释一下到底觉得啥地方不正常呢?

test!n的值突然变成奇怪的值,如0,-1,3之类。

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


IP 地址: 已记录   报告
高端调试 » 系统架构 » CPU架构 » Re: 多线程的奇怪问题

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.