작은 멀티 스레드 네트워크 서버를 쓰고 있습니다. 모든 고전적인 기능 : 들어오는 연결을 수신하고이를 받아들이고 다른 스레드에서 제공합니다. 또한,이 서버는 때때로 다시 시작해야하며, 그렇게하기 위해서는 a) 듣기를 멈추고, b) 연결된 모든 클라이언트를 쫓아 내고, c) 일부 설정을 조정/대기하고, d) 듣기를 다시 시작해야합니다.컬렉션 동기화 및 작업 중단
글쎄, 나는 꽤 많이 멀티 스레드 프로그램을 개발하는 것에 대해 모른다. 그래서 나는 도움을 요청하고있다. 다음은 내가 온 것입니다 (핵심 자료 만 해당).
class Server
{
class MyClient
{
Server server;
TcpClient client;
bool hasToFinish = false;
public MyClient(Server server, TcpClient client)
{
this.server = server;
this.client = client;
}
public void Go()
{
while (!hasToFinish)
{
// do all cool stuff
}
CleanUp();
}
private void CleanUp()
{
// finish all stuff
client.Close();
server.myClients.Remove(this);
}
public void Finish()
{
hasToFinish = true;
}
}
bool running = false;
TcpListener listener;
HashSet<MyClient> myClients = new HashSet<MyClient>();
public void Start()
{
if (running)
return;
myClients.Clear();
listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 1234);
listener.Start();
listener.BeginAcceptTcpClient(AcceptClient, this);
running = true;
}
public void Stop()
{
if (!running)
return;
listener.Stop();
foreach (MyClient client in myClients)
{
client.Finish();
}
myClients.Clear();
running = false;
}
public void AcceptClient(IAsyncResult ar)
{
MyClient client = new MyClient(this, ((TcpListener)ar.AsyncState).EndAcceptTcpClient(ar));
myClients.Add(client);
client.Go();
}
}
절대적으로 만족스럽지 않습니다. sychronizing이 없다 (나는 어디에 넣을 지 모른다!), Server.Stop()을 호출한다고해서 MyClient가 즉시 멈추지는 않는다. 이 문제를 어떻게 수정합니까?
btw, 휘발성을 사용할시기와 잠금을 사용할시기를 알아 보려면 "Java 동시성"을 권장합니다. 언제, 왜 사용해야하는지 설명합니다. 이 책은 Java에 관한 내용이지만 C sharp에도 적용됩니다. – nwang0