求线程同步高手:经典生产者和消费者如何用VC实现(50),我的程序问题出在什么地方(50)
我编了段代码不知怎么老出错
开始我吧互斥和信号量的创建都写到共享资源里了 不行
后来又写到线程里 利用了相同名称 错误照旧
逻辑上完全按照 操作系统 课本的模式
还是出错 郁闷郁闷郁闷郁闷郁闷郁闷郁闷郁闷郁闷郁闷……
int CConsumerThread::Run()
{
CP_CDlg *pDlg;
pDlg=(CP_CDlg*)this->m_pParent;
char*pBuf;
pBuf=this->m_Data;
CSemaphore* m_pSemaphoreEmpty;
CSemaphore* m_pSemaphoreFull;
CMutex *m_pMutex;
m_pSemaphoreFull =new CSemaphore(1,1,"SemaphoreFull");
m_pSemaphoreEmpty =new CSemaphore(0,1,"SemaphoreEmpty");
m_pMutex =new CMutex(false,"PC_Mutex");
CSingleLock mutexLock(m_pMutex),FullLock(m_pSemaphoreFull ),EmptyLock(m_pSemaphoreEmpty);
for(int i=0;i<CSM_BUF_COUNT;i+=10)
{
FullLock.Lock();
mutexLock.Lock();
sprintf(pBuf,pDlg->m_sBuf);
mutexLock.Unlock();
pBuf+=10;
m_Data[1000]=0;
mutexLock.Lock();
sprintf(pDlg->m_sBufCSM.GetBuffer(0),&m_Data[i]);
mutexLock.Unlock();
EmptyLock.Unlock();
}
return CWinThread::Run();
}
int CProducerThread::Run()
{
// TODO: Add your specialized code here and/or call the base class
CSemaphore* m_pSemaphoreEmpty;
CSemaphore* m_pSemaphoreFull;
CMutex *m_pMutex;
m_pSemaphoreFull =new CSemaphore(1,1,"SemaphoreFull");
m_pSemaphoreEmpty =new CSemaphore(0,1,"SemaphoreEmpty");
m_pMutex =new CMutex(false,"PC_Mutex");//
CP_CDlg *pDlg;
pDlg=(CP_CDlg*)m_pParentDlg;
CSingleLock mutexLock(m_pMutex),FullLock(m_pSemaphoreFull ),EmptyLock(m_pSemaphoreEmpty );
for(int i=0;i<100000;i++)
{
EmptyLock.Lock();
mutexLock.Lock();
pDlg->m_sBuf.Format("%0.10d",i);
mutexLock.Unlock();
FullLock.Unlock();
pDlg->UpdateData(false);
}
return CWinThread::Run();
}
Debug错误提示 mtex.cpp line 107
如果去掉信号量,只互斥没问题 。
看起来是信号量使用的错误 。