视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
VC++学习:用vc实现生产者消费者问题
2025-09-29 04:05:22 责编:小OO
文档
VC++学习:用vc实现生产者消费者问题 

文章来源:CSDN 作者:windcao

  很多情况下我们需要多个线程互相协助,来完成同一个任务。但是线程很难从外部进行控制。

利用线程同步技术可以使线程彼此交互,从而避免了外部控制对与时间和资源的浪费。

在实际工作过程中我就遇到了类似的问题,需要对共享的缓冲区进行操作。

  有插入的线程也有读取的线程,这使我忽然想到了生产者和消费者。我从MSDN 找到csdn 使用了各式各样的搜索引擎,只找到了很有现的关于CSemaphore的资料。

  ////////////////////////////////////

  // 生产者消费者问题

  ////////////////////////////////////

  生产者要不断将数据放入共享的缓冲,消费者要不断从缓冲取出数据。消费者必须等生产者

  取走数据后才能再放新数据(不覆盖数据),消费者必须等生产者放入新数据后才能去取(不重复)。

  /////////////////////////////////////

  // 使用信号量的方法

  /////////////////////////////////////

  当线程使用指定数量的共享资源时,首先调用信号量的lock方法"我能用资源吗"。当有的空闲

共享资源时(此时计数器值>0)线程继续执行并且减少计数器的数量告诉其他线程"我用了××个资

源"。否则挂起自己直到有足够的可用的资源为止。当使用完资源时线程调用unlock方法告诉其他

线程"我已经不用该资源了"。

  /////////////////////////////////////

  // 实现

  ////////////////////////////////////

  ///////////////////////////////////

  1创建一个基于对话框的程序。添加如下成员。

  //////////////////////////////////

  bool m_bSlow;//缓慢显示线程进行的结果

  CProducerThread *m_pProducerThread;//生产者线程

  CConsumerThread *m_pConsumerThread;//消费者线程

  CSemaphore* m_pSemaphoreEmpty;//缓冲空的标志

  CSemaphore* m_pSemaphoreFull;//缓冲满的标志

  CMutex *m_pMutex;//互斥信号量

  添加两编辑框用类向导,相关的添加成员

  CString m_sBufCSM;//用来显示消费者取到的数据

  CString m_sBuf;//显示生产者插入缓冲的数据

  /////////////////////////////////////////////

  2创建用户界面线程,生产者和消费者线程。

  ////////////////////////////////////////////

  CProducerThread::CProducerThread(void* hParent)

  :m_pParentDlg(hParent)

  { 

  } 

int CProducerThread::Run() 

  {

  CP_CDlg *pDlg;

  pDlg=(CP_CDlg*)m_pParentDlg;

  CSingleLock mutexLock(pDlg->m_pMutex);

  for(int i=0;i  pDlg->m_pSemaphoreEmpty->Lock();

  mutexLock.Lock();

  pDlg->m_sBuf.Format("%0.10d",i); 

  mutexLock.Unlock();

  pDlg->m_pSemaphoreFull->Unlock(); 

  }

  return CWinThread::Run();

  }

  CConsumerThread::CConsumerThread(void *pParent)

  :m_pParent(pParent)

  {

  }

  int CConsumerThread::Run() 

  {

  CP_CDlg *pDlg;

  pDlg=(CP_CDlg*)this->m_pParent; 

  char*pBuf; 

  pBuf=this->m_Data;

  bool bSleep;

  for(int i=0;i  pDlg->m_pSemaphoreFull->Lock();

  pDlg->m_pMutex->Lock();

  sprintf(pBuf,pDlg->m_sBuf);

  bSleep=pDlg->m_bSlow ;

  pDlg->m_pMutex->Unlock(); 

  pBuf+=10;

  if(pBuf>m_Data+CSM_BUF_COUNT-10)

  pBuf=m_Data;

  m_Data[CSM_BUF_COUNT]=0;

  pDlg->m_pMutex->Lock();

  sprintf(pDlg->m_sBufCSM.GetBuffer(CSM_BUF_COUNT+10),m_Data);

  pDlg->m_pMutex->Unlock();

  if (bSleep)

  Sleep(100);

  pDlg->m_pSemaphoreEmpty ->Unlock();

  }

  return CWinThread::Run();

  }

  ///////////////////////////////////////

  3启动线程:

  ///////////////////////////////////////

  m_pSemaphoreFull =new CSemaphore(1,1);

  m_pSemaphoreEmpty =new CSemaphore(0,1);

  m_pMutex =new CMutex;

  this->m_bUpdateAuto =false;

  this->m_pProducerThread =new CProducerThread(this);

  this->m_pConsumerThread =new CConsumerThread(this);

  this->m_sBuf.Format("12345670");

  this->UpdateData(false);

  this->m_pProducerThread->CreateThread(CREATE_SUSPENDED);

  VERIFY(m_pProducerThread->SetThreadPriority(THREAD_PRIORITY_IDLE)); 

  this->m_pConsumerThread->CreateThread(CREATE_SUSPENDED);

  VERIFY(m_pConsumerThread->SetThreadPriority(THREAD_PRIORITY_IDLE)); 

  this->m_pProducerThread->ResumeThread(); 

  this->m_pConsumerThread->ResumeThread(); 下载本文

显示全文
专题