: 以上是server片段程式
: 我想实作一个就是可以接受多个client的socket
: 以上的code可以做到接收多个client但无法同时执行pthread_create
: 就是说当我第一个client连线到server时,正执行pthread的thread_function时
: 当有其他client连入,必须等到pthread结束..等下个accept后才能执行
: 但我想做到的是
: 当第一个client连线执行时,这时有另一个client连入后可以马上接受accept并执行
: pthread的thread_function
: 不知道要如何修改才能达到?
================== 这个是子thread的执行部份 =============================
auto execute = [&](short int index){
std::string str;
while(server.msg_to_args(index)==true){
}
//client断线,子thread自动回收
};
==================== 这个是主thread的接收连线部份 ======================
template<class F>
void socket_server::start_accept(F fn){
while(new_socket = accept4(host_socket, (struct sockaddr *)&client_addr,
&client_addr_size,SOCK_NONBLOCK)){
recycle();
if(new_socket>0){
get_index();
busy_list[i] = true;
thread_list[i] = new std::thread(fn,i);
}
}
recycle();
}
这是我的multi-thread socket程式中的部份,以上两个段落都贴你应该会比较好了解
逻辑是:
1. 主thread只负责接收连线,收讯息是每个子thread自己的事
2. 子thread是一个lambda function,带一个index是表明自己是第几号子thread
3. 子thread的lambda直接宣告在global scope,像以下这样
#include <socket_server.h>
auto execute = [&](){};
socket_server server;
//server不一定要放在global,我是有我自己的需求才这样
int main(){
server.start_accept(execute);
//server crash
return 0;
}
你应该只要注意accept4那行的写法,应该就可以解决你的问题
但如果你也想用lambda来执行子thread,就可以参考我的作法
lambda的好处是可以pass by reference, 因为我的子thread与主thread有共用东西
最后,用std::thread而不用pthread是因为,std::thread有支援lambda写法
pthread我的编译器编不过,这部份你可以在自己试试看