abstract class Foo
{
private List<Object> container;
private bool update;
Foo Foo()
{
container = new List<object>();
update = false;
}
public abstract Bar CreateBar();
public void BeginUpdate()
{
if (!update)
{
Thread update_thread = new Thread(new ThreadStart(Update));
update_thread.Start();
}
}
private void Update()
{
update = true;
while (update)
{
lock (container)
{
if (...)
container.Add(this.CreateBar());
else
container.Remove(...);
}
Thread.Sleep(1337);
}
}
public void EndUpdate()
{
update = false;
}
public List<Object> Objects
{
get
{
lock (container)
{
return this.container;
}
}
}
}
Fooの外部の何かがFooのオブジェクトアクセサーを次のように呼び出すと、
List<Objects> objects = foo_instance.Objects;
foreach (Object o in objects)
{
Thread.Sleep(31173);
}
ロックはどのように発生しますか?Update()を実行しているスレッドは、上記のforeachがオブジェクトリストの処理を完了するまで待機する必要がありますか?これら2つが同時に機能することを望みますが、オブジェクトのディープコピーを作成する唯一の解決策はありますか?