在一个资源类中放一个section:class CRes  
{
public:
BOOL Unlock();
BOOL Lock();
int GetID();
void GeneID();
CRes();
virtual ~CRes();private:
CSingleLock* m_pSingleLock;
int m_nID;
CCriticalSection m_cs;
};CRes::CRes()
{
m_nID = 0;
    m_pSingleLock = NULL;}CRes::~CRes()
{}void CRes::GeneID()
{
m_nID++;
}int CRes::GetID()
{
return m_nID;}
BOOL CRes::Lock()
{
m_pSingleLock = new CSingleLock( &m_cs );
return m_pSingleLock ->Lock();
}BOOL CRes::Unlock()
{

if (  m_pSingleLock && m_pSingleLock ->IsLocked() )
{
m_pSingleLock ->Unlock();
delete m_pSingleLock;
m_pSingleLock = NULL;
return TRUE;
} return FALSE;
}线程函数:
unsigned int __stdcall ThreadFunc1( void* lpParam )
{
while( TRUE )
{
res.Lock();
res.GeneID();
res.Unlock();
}
return 0;
}
unsigned int __stdcall ThreadFunc2( void* lpParam )
{ int nRet; 
while( TRUE )
{
res.Lock();
nRet = res.GetID();
res.Unlock();
}
return nRet;
}使用代码:CRes res;    //全局对象
int main()
{

unsigned long hThread1,
          hThread2;
unsigned int nThreadId1,
          nThreadId2;
hThread1 = _beginthreadex( NULL, 0, ThreadFunc1, NULL, 0, &nThreadId1 );
hThread2 = _beginthreadex( NULL, 0, ThreadFunc2, NULL, 0, &nThreadId2 );
Sleep( 30000 );
         
         return 0;
}
通过实现一个带有临界段的类,达到让其对象也临界使用的效果,
我这样做不知正确与否?我运行的结果是无论如何只有一个线程在运行而另一个没有运行。请大人指点!

解决方案 »

  1.   

    while( TRUE )
    {
    res.Lock();
    res.GeneID();
    res.Unlock();
    }
    return 0;是你这段程序的问题,系统在while (true) {} 中执行没有创建第二个线程的机会。
      

  2.   

    while( TRUE )
    {
    res.Lock();
    res.GeneID();
    res.Unlock();
                      Sleep (100) ;
    }应该在里面加一句 Sleep (100) ;
    在里面加个printf  观察 结果
      

  3.   

    回复人: mixtrue(忽报人间曾伏虎,泪飞顿作倾盆雨。) ( ) 信誉:105  2005-06-15 17:58:00  得分: 0  
     
     
        while( TRUE )
    {
    res.Lock();
    res.GeneID();
    res.Unlock();
    }
    return 0;是你这段程序的问题,系统在while (true) {} 中执行没有创建第二个线程的机会。
      
     
    ----
    谢谢,但我建立线程是在这里呀,我用Spy是可以看到三个线程的。
      

  4.   

    回复人: cnwolf(独狼) ( ) 信誉:100  2005-06-15 21:31:00  得分: 0  
     
     
       哪个线程运行,哪个不运行你是如何察看的
      
     
    ---
    我是用在线程里加AfxMessageBox()的方法。