在一个资源类中放一个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;
}
通过实现一个带有临界段的类,达到让其对象也临界使用的效果,
我这样做不知正确与否?我运行的结果是无论如何只有一个线程在运行而另一个没有运行。请大人指点!
{
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;
}
通过实现一个带有临界段的类,达到让其对象也临界使用的效果,
我这样做不知正确与否?我运行的结果是无论如何只有一个线程在运行而另一个没有运行。请大人指点!
解决方案 »
- mfc单文档中,继承CScrollView,怎么获取当前滚动条的位置?
- ping命令 外网回显
- 利用互斥量实现Windows多线程运行时出错,希望牛人们指导!
- 如何禁止程序从IE临时文件目录下下载文件?
- Socket和TCP/IP协议的问题
- 急救
- 请教TCP协议数据的通知的问题!!!着急!!!
- 怎样不通过打印设置直接在打印预览中是横向打印????????急,多谢了!!!!!!
- 怎么不认识access数据文件?
- ListView中如何得到TreeCtl的点击?就像资源管理器点一下右边就出现文件和目录?
- 各位COM高手和COM初学者,请你们说说COM的 proxy/stub程序实现时的相关问题,谢谢!!!
- 怎么样在显示产品页面插入一条产品记录?
{
res.Lock();
res.GeneID();
res.Unlock();
}
return 0;是你这段程序的问题,系统在while (true) {} 中执行没有创建第二个线程的机会。
{
res.Lock();
res.GeneID();
res.Unlock();
Sleep (100) ;
}应该在里面加一句 Sleep (100) ;
在里面加个printf 观察 结果
while( TRUE )
{
res.Lock();
res.GeneID();
res.Unlock();
}
return 0;是你这段程序的问题,系统在while (true) {} 中执行没有创建第二个线程的机会。
----
谢谢,但我建立线程是在这里呀,我用Spy是可以看到三个线程的。
哪个线程运行,哪个不运行你是如何察看的
---
我是用在线程里加AfxMessageBox()的方法。