我正在編寫一個小型多線程網絡服務器。所有經典的東西:它監聽傳入的連接,接受它們,然後在不同的線程中提供它們。此外,此服務器有時必須重新啓動,並且必須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();
}
}
這絕對不滿意。沒有同步(我只是不知道該把它放在哪裏!),並且調用Server.Stop()不會使MyClient -s立即停止。我如何解決這些問題?
順便說一句,如果你想弄清楚什麼時候使用volatile和何時使用鎖,我推薦書「實踐中的Java併發」。它解釋了爲什麼以及何時需要使用它們。這本書是關於Java的,但它也適用於C語言。 – nwang0