如果其对象在多个线程中运行,我们是否需要锁定类成员功能
Do we need to lock class member functions if its objects are running in multiple threads
我正在使用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);
}
};
我将为新线程中的每个新客户端创建一个新的 networkcom 对象。因此,当我这样做时,我需要使用Mutex锁定类的成员函数,每个线程中的对象都使用成员函数senddata和收到。
如果我必须使用Mutex。如果没有Mutex
作为大多数套接字API,Winsock不喜欢并发访问同一套接字:
send
不应在同一面向流的插座上调用 同时来自不同的线程,因为某些Winsock提供商 可能会将大的发送请求分为多个传输,这 可能导致多个并发发送的意外数据交织 在同一面向流的插座上的请求。
来自MSDN,recv
具有相似的约束。
因此,如果您要在多个线程之间共享相同的套接字,则需要同步对该套接字的所有访问。静音是实现这种同步的一种方法。但是,如果您使用不同的插座来用于不同的线程,那么只要您不共享线程之间的任何其他(可变的)数据,就不需要同步。
相关文章:
- 当返回类型声明为 ListNode 时,我们是否可以返回 false<T>*
- 我们是否需要为 C++ 中的多个函数初始化多个模板?
- 如果我们通过引用传递变量,则递归中使用的堆栈空间量是否为零?
- 我们是否应该转向新的自我分配保护方式?
- 我们是否能够在 C++20 中构建具有视图的容器?
- 用于检查我们是否有有效数独的辅助功能
- std::next 是否检查我们是否已经在容器的末尾?
- 我们是否需要序列化 VAO 和 VBO
- 检查迭代器是否具有我们要在C++中分配的值是否明智的优化
- 为什么我们要检查 temp == 是否为空?
- 我们是否可以保证任何原子写入都会立即将原子变量的新值存储在主存储器中?
- 我们是否需要对多线程 x32 系统使用 lock 来读取或写入 uint32_t 变量
- 我们是否需要调用SQLallochandle来分配SQLHSTMT,然后再调用SQLEXECTIRECT
- 我们如何知道 python 代码在 C 或 C++ 中是否处于永无止境的循环中
- 我们是否可以使用 SEAL / PySEAL 库对加密数据执行除法操作Microsoft?
- 用户空间(Linux)中是否有高分辨率时钟(我们)?
- 我们如何在c 中序列化或应对类的对象.是否有任何预定义的库
- 我们是否需要互斥锁来执行多线程文件 IO
- 我们是否需要担心 32 位或 64 位整数,或者我们只使用 'int'
- 我们是否应该在项目中包含的所有文件中声明外部变量