我当前的代码看起来像这样
void XXX::waitForUpdates()
{
boost::unique_lock<boost::mutex> lock(mutex_agentDone);
while(!allAgentUpdatesDone()) {
COND_VAR_AGENT_DONE.wait(lock);
}
}
void XXX::onAgentUpdate(YYY argums){
Agent * target = const_cast<Agent*>(argums.GetAgent());
boost::unique_lock<boost::mutex> lock(mutex_agentDone);
REGISTERED_AGENTS.setDone(target,true);
COND_VAR_AGENT_DONE.notify_all();
}
一切都很好,除了onAgentUpdate
每 1 秒调用大约一百万次时,我不得不担心性能和优化。
所以我想如果我更改执行检查的wait(lock)
totimed_wait
版本allAgentUpdatesDone()
,我可以跳过.notify()
s ,否则每秒会以数十万的顺序调用!别喘,这是一个模拟框架:)
然后我问myseld:我需要这个mutex_agentDone
做什么?我可以像这样修改这两个函数:
void XXX::waitForUpdates()
{
//this lock will become practically useless, coz there is no other
// mutex_agentDone being locked in any other function.
boost::unique_lock<boost::mutex> lock(mutex_agentDone);
while(!allAgentUpdatesDone()) {
COND_VAR_AGENT_DONE.timed_wait(lock,some_time_interval);
}
}
void XXX::onAgentUpdate(YYY argums){
Agent * target = const_cast<Agent*>(argums.GetAgent());
REGISTERED_AGENTS.setDone(target,true)
}
问题是:这安全吗?
谢谢你
一个小提示:假设这两个函数中的其余操作已经由它们自己的互斥锁保护(REGISTERED_AGENTS
是一个类对象,在每个访问器和迭代方法中都调用了一个container
和它自己的对象,因此使用与REGISTERED_AGENTS相同的方法进行迭代)mutex
allAgentUpdatesDone()
container
mutex