make_server_socket( port); handleAccept( socket_fd); main( ac, * tcp_socket = make_server_socket( (tcp_socket == - ( socket_fd == thread(handleAccept,
1.int make_server_socket(int port) 用於創建服務端的socket的函數,將在後面進行講解。
2.void handleAccept(int socket_fd) 用於處理連接到服務端的客戶端的函數,將在後面進行講解。
3.thread C++11中出現的用於多線程編程,需要#include <thread> ,以前涉及到多線程編程時,在windows中需要使用CreateThread,而在linux中需要用pthread_create函數
而當thread出現後,在代碼層面上,windows和linux就統一了。
thread的構造函數,
template<class _Fn,class... _Args>
explicit thread(_Fn&& _Fx, _Args&&... _Ax)
{
//
}
簡單來說第一個參數表示函數的名字,其余的參數表示第一個參數所對應函數的參數,模板中的…用到了C++11中的變長模板這一個概念。
比如 t=thread(handleAccept,socket_fd)// handleAccept 函數名字,該函數有一個int的參數,socket_fd對應該int 參數
在線程創建完成後,我用t.detach(),將線程與主線程分離開,這樣線程在線程結束時,就會清空自動該線程所占用的棧空間。並且主線程也可以和支線程一起運行,不用等待支線程結束後才能繼續執行。
而如果我們如果使用t.join();會導致主線程必須等待所有當前的支線程結束後才可以往下執行。這樣就無法同時處理不同客戶端的請求了
還有要注意的是thread默認的joinable值是true,這意味著線程是不會析構的,在重復對同一對象創建線程時是會異常終止的,我們需要使用detach()和join(),將joinable的值改為false
例如
a(<< a << main( ac, *=
=
大家可以在vs2013中發現
所以SOCKET和int是可以進行轉換的。