如果其对象在多个线程中运行,我们是否需要锁定类成员功能

Do we need to lock class member functions if its objects are running in multiple threads

本文关键字:是否 我们 锁定 功能 成员 运行 对象 线程 如果      更新时间:2023-10-16

我正在使用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具有相似的约束。

因此,如果您要在多个线程之间共享相同的套接字,则需要同步对该套接字的所有访问。静音是实现这种同步的一种方法。但是,如果您使用不同的插座来用于不同的线程,那么只要您不共享线程之间的任何其他(可变的)数据,就不需要同步。