急求ACE高手指点
- C/C++ code
include "stdafx.h"#include <cstdlib>#include <vector>#include <algorithm>#include <iostream>#include <stdlib.h>#include "ace/Task.h"#include "ace/Semaphore.h"using namespace std;class DataCheckSetMoiData : public ACE_Task_Base{public: DataCheckSetMoiData( ACE_Semaphore& psema, ACE_Semaphore& csema, std::list<int>& moiList, ); virtual int svc(void);private: std::list<int>& moiList_; ACE_Semaphore& psema_; ACE_Semaphore& csema_;};int DataCheckSetMoiData::svc(){ for (int i =0 ; i< 8; i++) { psema_.acquire(); moiList_.push_back(i); csema_.release(); } return 0;}class DataCheckGetMoiData : public ACE_Task_Base{public: DataCheckGetMoiData( ACE_Semaphore& psema, ACE_Semaphore& csema, std::list<int>& moiList, ); virtual int svc(void);private: std::list<int>& moiList_; ACE_Semaphore& psema_; ACE_Semaphore& csema_;};int DataCheckGetMoiData::svc(){ csema_.acquire(); int j = moiList_.front(); moiList_.pop_front(); psema_.release(); cout<<j<<endl; return 0;}int _tmain(int argc, _TCHAR* argv[]){ ACE_Semaphore psema(4); ACE_Semaphore csema(0); std::list<int> moiList; DataCheckSetMoiData * data = new DataCheckSetMoiData(psema, csema, moiList); data->activate(); DataCheckGetMoiData* getdata = new DataCheckGetMoiData(psema, csema, moiList); getdata->activate(); data->wait(); getdata->wait(); system("pause"); return 0; }怎么结果只输出个1 啊
[解决办法]
int DataCheckGetMoiData::svc()
{
csema_.acquire();
int j = moiList_.front();
moiList_.pop_front();
psema_.release();
cout<<j<<endl;
return 0;
}
这个线程函数怎么不循环?
还有信号量要是全局的,才能锁住线程啊
[解决办法]
这个你既然是用ACE_TASK,里面就用ACE_Message_Queque来实现的
SVC是开辟的线程,在里面用qetq(mb),
在主线程中可以用putq(mb),
然后在需要退出的时候由主线程发一个消息就可以
[解决办法]
- C/C++ code
for (int i = 0; i < 8; i++) { csema_.acquire(); int j = moiList_.front(); moiList_.pop_front(); cout<<j<<endl; psema_.release(); }