2010-05-13 99 views
0

我有一個應用程序與某些硬件進行一些套接字通信。 假設對於特定的硬件,我有一個對象,並且這個對象啓動一個線程,該線程監聽特定的端口號5001,直到連接建立。刪除對象時刪除線程

現在,如果我刪除這個obect有無論如何,我可以確保無限的監聽端口號5001的線程也被破壞。

所以問題是每當一個新的對象爲同一個設備創建舊線程不會被破壞,因此有線程泄漏。

+0

它是平臺特定的,你使用什麼操作系統? – 2010-05-13 04:41:50

+0

Windows和winsock – ckv 2010-05-13 04:43:21

回答

1

在Windows中,您可以使用WaitForSingleObject函數來檢查線程是否退出(您可以將線程的句柄作爲參數傳遞)。你可能想創建一個事件來啓動線程的退出。

+0

不能使用線程句柄來殺死或刪除線程。 – ckv 2010-05-13 04:57:31

+0

此外,由於線程將使用接受套接字函數在特定端口號上無限聽取,因此我無法安全地退出線程。 – ckv 2010-05-13 05:01:13

+0

你可以使用'TerminateThread'函數殺死一個線程,但這是一個極端的措施。 – 2010-05-13 05:54:01

1

在這種情況下,您需要使用非阻塞套接字。在阻塞套接字的情況下,Accept()調用塊直到有連接。 您可以使用ioctlsocket使套接字非阻塞,並從Accept()調用中檢查錯誤代碼WSAEWOULDBLOCK。 然後修改你的無限循環來使用WaitForSingleObject。

更多信息here

0

它也許值得設置變量的說,線程循環應該退出,然後一些數據發送到插座。這將導致套接字接收數據,喚醒,發現其退出和退出的時間。