c++多线程编程

for(inti=0;i<vStationNum;i++){m_CorDList.clear();for(std::list<RecDist>::iteratorvIti... for (int i=0;i<vStationNum;i++)
{
m_CorDList.clear();
for(std::list<RecDist>::iterator vIti = m_Data.m_RDistList[i].begin(); vIti != m_Data.m_RDistList[i].end(); vIti++)
{
int istate = vIti->mystate;
m_CorDList.clear();
rdist = *vIti;
m_CorDList.push_back(rdist);

for(int j = i+1; j < vStationNum ;j++)
{
for(std::list<RecDist>::iterator vItj = m_Data.m_RDistList[j].begin(); vItj != m_Data.m_RDistList[j].end(); vItj++)
{
int jstate = vItj->mystate;
if (abs(jstate-istate)==0)
{
rdist = *vItj;
m_CorDList.push_back(rdist);
}
}
}

if (m_CorDList.size()>=5)//如果记录条数(站的个数)大于等于4
{
TDOAPos posTaylor;
posTaylor.x = 0;
posTaylor.y = 0;
posTaylor.z = 0;
std::map<int, TDOAPos> mapChan;//存储返回Chan方法中的主站号以及位置信息

mapChan = m_pAlgorithmImp->MyCalPosByChan_Over4Station(m_CorDList);//Chan方法估计位置返回主站号与位置信息//向mapChan写入数据

std::map<int, TDOAPos>::const_iterator map_Ite = mapChan.begin();
int baseA = map_Ite->first; //主站号

TDOAPos posChan;//Chan位置坐标
posChan.x = map_Ite->second.x;
posChan.y = map_Ite->second.y;
posChan.z = map_Ite->second.z;
vChanPos.push_back(posChan);//存储Chan得到的位置信息

posTaylor = m_pAlgorithmImp->MyTalyorMethod_Test(baseA, posChan, m_CorDList);//对Chan方法得到的数据进行泰勒迭代修正

vTayLorPos.push_back(posTaylor);
}
}
}
请问,现在我想用多线程实现这个操作,前面读取数据放在m_CorDList,如果大于等于5就执行下面的操作,我想将读取数据和if{}操作能不能用两个线程实现,一个是读取数据放在m_CorDList,另一个就是if{}操作。没接触过多线程,希望高手指点,最好给出详细实现过程!谢谢
展开
 我来答
chenchen5421
2013-07-23 · 超过17用户采纳过TA的回答
知道答主
回答量:90
采纳率:0%
帮助的人:38.1万
展开全部
这应该是内存共享式的多线程,要注意的是要设定好互斥访问信号量,如果没设信号量,假如正好在判断m_CorDList数据个数时(假如当时数据数小于5)的同时另一线程又住m_CorDList里添加数据,在下一次的if判断时m_CorDList中的数据个数就可能远远多于5个,加入互斥访问信号量,在if判断时不允许其他线程往m_CorDList中写数据,而且在添加数据的线程在每添加数据之前也要先判断m_CorDList中数据是否大于等于5个,如果大于等于5个就不要添加。
追问

 

//线程函数

DWORD WINAPI CTDOAView::MyProcData_Thread(LPVOID pParam)
{
 Str_Dist *vStr_Dist = (Str_Dist*)pParam;

{

    //中间操作省略

}

delete vStr_Dist;
 return 0;
}

 

现在会出现错误。不知道什么原因?

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
欢乐多Ek
2013-07-23 · TA获得超过478个赞
知道小有建树答主
回答量:477
采纳率:0%
帮助的人:406万
展开全部
加一个互斥量和条件变量,在读取数据线程读取完数据判断是否大于5,大于5激活条件变量,处理线程开始工作处理数据。
处理线程在数据量小于5时候wait条件变量,一旦条件变量被激活开始处理。
很简单,看看Windows核心编程。
更多追问追答
追问
for循环中是读取m_Data中数据,读取完后,判断是否大于5,大于5就处理,处理完以后再读取数据进行处理。这是顺序执行的流程,用多线程实现的话,主要是不知道读取m_Data数据操作怎么写,难道还是for循环吗?for循环中i是变的,所以数据每次也不一样。现在很迷糊,不知道如何将顺序的改成多线程(我只知道上面的应该可以使用两个线程来实现)。还请高手帮下忙,谢谢
追答
不太明白你这么做的意义。不过感觉你应该把上面的所有单独放到一个线程里面,在主线程里面只用判断一下m_Data的数据量就行了,其他的交给工作线程去做就行了。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Hiei1234
2013-07-23 · TA获得超过157个赞
知道小有建树答主
回答量:221
采纳率:0%
帮助的人:122万
展开全部
读写分来2个函数

读函数 写函数 各放入一条线程
然后对m_CorDList读写加锁 注意同步互斥就行了

可以这样理解 写函数是生产者 读函数是 消费者 典型的生产者消费者模型
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式