求线程同步高手:经典生产者和消费者如何用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
如果去掉信号量,只互斥没问题 。
看起来是信号量使用的错误 。
开始我吧互斥和信号量的创建都写到共享资源里了 不行
后来又写到线程里 利用了相同名称 错误照旧
逻辑上完全按照 操作系统 课本的模式
还是出错 郁闷郁闷郁闷郁闷郁闷郁闷郁闷郁闷郁闷郁闷……
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
如果去掉信号量,只互斥没问题 。
看起来是信号量使用的错误 。
...全文
相关推荐
操作系统同步和互斥(生产者和消费者问题)
操作系统线程同步和互斥,生产者和消费者问题例子,VC++编写
矩阵相似——例题中证明的性质
文章目录性质1~5性质6~7性质8(一定是某某矩阵的情况)性质9性质10关于置换矩阵与相似的关系置换矩阵的定义性质1证明性质2实战演练1证明实战演练2证明 性质1~5 与幂零矩阵相似的矩阵仍是幂零 与对合相似的仍是对合 与幂零相似仍是幂零且它们的幂零指数相等 若A的多项式f(A)A的多项式f(A)A的多项式f(A)满足f(A)=a0I+a1A+...+amAmf(A)=a_0I+a_1A+......
分块矩阵的性质
文章目录命题1 and 推论主对角线上所有的子矩阵都是方阵命题2命题3 命题1 and 推论 As×n≠0A_{s×n}\ne 0As×n̸=0 Bn×m的列向量组是β1,β2,...,βmB_{n×m}的列向量组是\beta_1,\beta_2,...,\beta_mBn×m的列向量组是β1,β2,...,βm AB=A(β1,β2,...,βm)=(Aβ1,Aβ2,...,Aβm...
生产者消费者问题vc6源码
用vc6+mfc实现的生产者消费者同步互斥过程展示。比控制台输出相比直观得多,更有利于理解同步互斥的概念。
vc 多个生产者和消费者问题
可设多个生产者和消费者,还有产品和缓冲区


进程/线程/DLL
