【发布时间】:2015-11-03 17:28:11
【问题描述】:
互斥锁的正确用法是什么?我怎么知道它在保护什么?它是否会在锁定期间停止所有线程运行?
例如,我有一个包含对象列表的单例。
class Foo
{
// Pretend this is a singleton.
std::list<Object>* GetObjects() { return &objects; }
void Reset() { for ( auto iter = objects.begin(); iter != objects.end(); ++iter ) { delete *iter; } }
std::list<Object> objects;
};
在一个单独的类中,我有一个更新方法。这是在单独的线程中运行的。
class Bar
{
void Update()
{
std::list<Object>* objects Foo.GetObjects();
for(auto iter = objects.begin(); iter != objects .end(); ++iter )
iter->SetTransform(50,50,50);
}
};
我的问题是我想在 Foo 上调用 Reset() 并删除所有对象。但是我的 Bar 类正在更新所有这些对象。因此,如果它在更新方法的中间,它可能会尝试修改已删除的对象。
如何防止这种情况发生?
我可以在重置功能中创建一个互斥锁并在删除之前将其锁定并在之后将其解锁吗?像这样的:
void Reset()
{
Mutex mutex; mutex.Lock()
for ( auto iter = objects.begin(); iter != objects.end(); ++iter )
delete *iter;
mutex.Unlock();
}
这会让其他班级知道这些资源被锁定了吗?我不确定互斥锁如何知道要保护哪些信息。它如何知道它需要在单例类中锁定列表。
顺便说一句,这都是伪代码,因此存在语法错误和缺少信息。
【问题讨论】:
-
你在寻找这样的东西吗Mutex example / tutorial =
标签: c++ multithreading