首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

请帮忙看看小弟我这个多线程的程序使用临界区是不是出错了

2012-01-29 
请帮忙看看我这个多线程的程序使用临界区是不是出错了?我在网上找到篇文章(《Windows多线程多任务设计初步》

请帮忙看看我这个多线程的程序使用临界区是不是出错了?
我在网上找到篇文章(《Windows多线程多任务设计初步》),其中讲到临界区的使用,文章中给了个例程,但用的是MFC,如下:
#include   "afxmt.h "

int   array[10],destarray[10];
CCriticalSection  

Section;////////////////////////////////////////////////////////////////////////
UINT   WriteThread(LPVOID   param)
{
            Section.Lock();
            for(int   x=0;x <10;x++)
                      array[x]=x;
            Section.Unlock();
}

UINT   ReadThread(LPVOID   param)
{
            Section.Lock();
            For(int   x=0;x <10;x++)
                      Destarray[x]=array[x];
            Section.Unlock();
}

我用的编译器是devc++,不是vc,但我想试试,就查了MSDN改成下面的样子:
//试试临界区
#include   <windows.h>
#include   <process.h>
#include   <iostream>

using   namespace   std;

int   array[10],   Destarray[10];

CRITICAL_SECTION   cs;//临界区  

//为array赋值  
void   WriteThread(PVOID   p)
{
          EnterCriticalSection(&cs);//进入临界区  
          for(int   x   =   0;   x <10;   x++)
          {
                          array[x]   =   x;
          }
          LeaveCriticalSection(&cs);//离开临界区  
}  

//将array中的值传给Destarray  
void   ReadThread(PVOID   p)
{
          EnterCriticalSection(&cs);
          for(int   x   =   0;   x <10;   x++)
          {
                          Destarray[x]   =   array[x];
          }
          LeaveCriticalSection(&cs);
}

int   main()
{
        InitializeCriticalSection(&cs);//初始化临界区  
        _beginthread(WriteThread,0,NULL);
        _beginthread(ReadThread,0,NULL);
        DeleteCriticalSection(&cs);//删除临界区  
        for(int   i   =   0;   i <10;   i++)
        {
                        cout < <array[i] < < "   " < <Destarray[i] < <endl;
        }
        cout < < "完成 " < <endl;
        cin.get();
        return   0;  
}

开始时没有加入和临界区有关的那些代码(基本上就是有注释那些),程序编译通过,显示的数字次序是乱的。之后我加入了和临界区有关的代码,编译也通过了,但是运行时windows(我的是XP)弹出了对话框:
“thread3.exe   -   应用程序错误
    "0x77f51c96 "指令引用的 "0x00000010 "内存。该内存不能为 "written "。
      要终止程序,请单击“确定”。
      要调试程序,请单击“取消”。”
  还有一个发送错误报告的对话框。


我又进行了单步调试,每次程序在不同的地方会弹出个对话框:
“Warning
                  程序产生一个访问违例(段异常) "
点OK后接着再按单步什么的就没反应的,但没死机,也没碰到蓝屏什么的。另外在单步调试时显示的值全是0.请各位高手帮忙看看是不是我的程序出什么错了?谢谢!

[解决办法]
有问题, 你的程序会有3个线程, main, WriteThread和ReadThread, 你只考虑了WriteThread和ReadThread的互斥, 确没有考虑main线程要等待WriteThread和ReadThread全完成后, 才能DeleteCriticalSection.

int main()
{
HANDLE h[2];
InitializeCriticalSection(&cs);//初始化临界区
h[0] = (HANDLE)_beginthread(WriteThread,0,NULL);
h[1] = (HANDLE)_beginthread(ReadThread,0,NULL);

// 等待2个线程结束
WaitForMultipleObjects(sizeof(h), h, TRUE, INFINITE);

DeleteCriticalSection(&cs);//删除临界区
for(int i = 0; i <10; i++)
{
cout < <array[i] < < " " < <Destarray[i] < <endl;
}
cout < < "完成 " < <endl;
cin.get();
return 0;
}

[解决办法]
WaitForMultipleObjects(sizeof(h),h,TRUE, INFINITE);
改为
WaitForMultipleObjects(2,h,TRUE, INFINITE);

sizeof(h)!=2 ==8

热点排行