Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果类的对象在多个线程中运行,我们是否需要锁定类成员函数 我用Winsock库处理基于C++的网络工程。 代码是: class NetworkCom { private: SOCKADDR_IN ClientAddress; int ClientAddressSize; SOCKET SenderSocket; public: NetworkCom(SOCKET& sock) { ClientAddressSize = sizeof(ClientAddress); getpeername(sock,(SOCKADDR*)&ClientAddress,&ClientAddressSize); sock = socket(AF_INET,SOCK_STREAM,0); SenderSocket = socket(AF_INET,SOCK_STREAM,0); } int SendData(char message[]) { int val; val = send(sock,message,sizeof(message),0); // if val <= 0 then error return val; } string RecieveData() { string message; char msg[100]; connect(SenderSocket,(SOCKADDR*)&ClientAddress,&ClientAddressSize); recv(SenderSocket,msg,100,0); message = msg; return message; } ~NetworkCom() { cout<<"Closing Connection.."; closesocket(SenderSocket); closesocket(sock); } }; classnetworkcom { 私人: 客户地址中的SOCKADDR_; int客户端地址大小; 插座发送器插座; 公众: NetworkCom(套接字和sock) { ClientAddress size=sizeof(ClientAddress); getpeername(sock,(SOCKADDR*)和ClientAddress,以及ClientAddressSize); sock=socket(AF\u INET,sock\u STREAM,0); SenderSocket=socket(AF_INET,SOCK_STREAM,0); } int SendData(字符消息[]) { int-val; val=send(sock,message,sizeof(message),0);//如果val_C++_Multithreading_Mutex_Winsock2 - Fatal编程技术网

如果类的对象在多个线程中运行,我们是否需要锁定类成员函数 我用Winsock库处理基于C++的网络工程。 代码是: class NetworkCom { private: SOCKADDR_IN ClientAddress; int ClientAddressSize; SOCKET SenderSocket; public: NetworkCom(SOCKET& sock) { ClientAddressSize = sizeof(ClientAddress); getpeername(sock,(SOCKADDR*)&ClientAddress,&ClientAddressSize); sock = socket(AF_INET,SOCK_STREAM,0); SenderSocket = socket(AF_INET,SOCK_STREAM,0); } int SendData(char message[]) { int val; val = send(sock,message,sizeof(message),0); // if val <= 0 then error return val; } string RecieveData() { string message; char msg[100]; connect(SenderSocket,(SOCKADDR*)&ClientAddress,&ClientAddressSize); recv(SenderSocket,msg,100,0); message = msg; return message; } ~NetworkCom() { cout<<"Closing Connection.."; closesocket(SenderSocket); closesocket(sock); } }; classnetworkcom { 私人: 客户地址中的SOCKADDR_; int客户端地址大小; 插座发送器插座; 公众: NetworkCom(套接字和sock) { ClientAddress size=sizeof(ClientAddress); getpeername(sock,(SOCKADDR*)和ClientAddress,以及ClientAddressSize); sock=socket(AF\u INET,sock\u STREAM,0); SenderSocket=socket(AF_INET,SOCK_STREAM,0); } int SendData(字符消息[]) { int-val; val=send(sock,message,sizeof(message),0);//如果val

如果类的对象在多个线程中运行,我们是否需要锁定类成员函数 我用Winsock库处理基于C++的网络工程。 代码是: class NetworkCom { private: SOCKADDR_IN ClientAddress; int ClientAddressSize; SOCKET SenderSocket; public: NetworkCom(SOCKET& sock) { ClientAddressSize = sizeof(ClientAddress); getpeername(sock,(SOCKADDR*)&ClientAddress,&ClientAddressSize); sock = socket(AF_INET,SOCK_STREAM,0); SenderSocket = socket(AF_INET,SOCK_STREAM,0); } int SendData(char message[]) { int val; val = send(sock,message,sizeof(message),0); // if val <= 0 then error return val; } string RecieveData() { string message; char msg[100]; connect(SenderSocket,(SOCKADDR*)&ClientAddress,&ClientAddressSize); recv(SenderSocket,msg,100,0); message = msg; return message; } ~NetworkCom() { cout<<"Closing Connection.."; closesocket(SenderSocket); closesocket(sock); } }; classnetworkcom { 私人: 客户地址中的SOCKADDR_; int客户端地址大小; 插座发送器插座; 公众: NetworkCom(套接字和sock) { ClientAddress size=sizeof(ClientAddress); getpeername(sock,(SOCKADDR*)和ClientAddress,以及ClientAddressSize); sock=socket(AF\u INET,sock\u STREAM,0); SenderSocket=socket(AF_INET,SOCK_STREAM,0); } int SendData(字符消息[]) { int-val; val=send(sock,message,sizeof(message),0);//如果val,c++,multithreading,mutex,winsock2,C++,Multithreading,Mutex,Winsock2,与大多数套接字API一样,Winsock不喜欢并发访问同一套接字: 不应在同一个面向流的套接字上调用send 由于某些Winsock提供程序 可能会将一个大型发送请求拆分为多个传输 可能导致来自多个并发发送的非预期数据交错 在同一个面向流的套接字上的请求 从,有类似的限制 因此,如果您在多个线程之间共享同一个套接字,则需要同步对该套接字的所有访问。互斥是实现此同步的一种方法。但是,如果您为不同的线程使用不同的套接字,则无需同步,只要您不共享任何其他套接字(可变)线程之间的数据。与大多数套接字AP

与大多数套接字API一样,Winsock不喜欢并发访问同一套接字:

不应在同一个面向流的套接字上调用
send
由于某些Winsock提供程序 可能会将一个大型发送请求拆分为多个传输 可能导致来自多个并发发送的非预期数据交错 在同一个面向流的套接字上的请求

从,有类似的限制


因此,如果您在多个线程之间共享同一个套接字,则需要同步对该套接字的所有访问。互斥是实现此同步的一种方法。但是,如果您为不同的线程使用不同的套接字,则无需同步,只要您不共享任何其他套接字(可变)线程之间的数据。

与大多数套接字API一样,Winsock不喜欢并发访问同一套接字:

不应在同一个面向流的套接字上调用
send
由于某些Winsock提供程序 可能会将一个大型发送请求拆分为多个传输 可能导致来自多个并发发送的非预期数据交错 在同一个面向流的套接字上的请求

从,有类似的限制


因此,如果您在多个线程之间共享同一个套接字,则需要同步对该套接字的所有访问。互斥是实现此同步的一种方法。但是,如果您为不同的线程使用不同的套接字,则无需同步,只要您不共享任何其他套接字(可变)线程之间的数据。

这两行没有意义
val=send(sock,message,sizeof(message),0);//如果val
sizeof(message)
不是数组参数的大小。请使用std::string!另外,请注意,如果您需要同时处理大量连接,则为每个连接生成一个线程是一种有效的方法。@william jones send返回已发送的字符数,因此如果val这两行没有意义,
val=send(sock,message,sizeof(message),0);//如果val
sizeof(message)
不是数组参数的大小。请使用std::string!另外,请注意,如果需要同时处理大量连接,则为每个连接生成一个线程是一种有效的方法。@william jones send返回发送的字符数,因此如果val