求线程同步高手:经典生产者和消费者如何用VC实现(50),我的程序问题出在什么地方(50)

曹建峰-17年老猿 2004-01-09 02:24:10
我编了段代码不知怎么老出错
开始我吧互斥和信号量的创建都写到共享资源里了 不行
后来又写到线程里 利用了相同名称 错误照旧
逻辑上完全按照 操作系统 课本的模式
还是出错 郁闷郁闷郁闷郁闷郁闷郁闷郁闷郁闷郁闷郁闷……
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
如果去掉信号量,只互斥没问题 。
看起来是信号量使用的错误 。
...全文
171 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
上铺的兄弟你哪里有电子版吗
会思考的草 2004-01-12
  • 打赏
  • 举报
回复
《windows操作系统原理》中有完整实现源码。
DotLSong 2004-01-12
  • 打赏
  • 举报
回复
在主线程中初始化信号量,然后在子线程中
P操作对应于WaitForSingleObject
V操作对应于ReleaseSemaphore
DotLSong 2004-01-12
  • 打赏
  • 举报
回复
不是两个线程都要去new一个信号量出来,只需要在主线程中初始化信号量就可以了
DotLSong 2004-01-12
  • 打赏
  • 举报
回复
呵呵,基本上模式就是那样了,只不过你自己没有仔细看罢了
luoshayu 2004-01-09
  • 打赏
  • 举报
回复
107是那行啊

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧