传递指针后更新值

时间:2013-07-24 08:44:27

标签: multithreading sockets pointers tcp mutex

我正在使用TCP服务器发送char数组。函数send()需要char *,但在此之前,它必须侦听并接受连接。鉴于此,我想在接受传入连接时发送最新数据。以前,我使用了两个线程。一个更新缓冲区中的值,另一个只是等待连接,然后发送数据。

我知道没有锁定互斥锁可能存在问题,但除此之外,如果我将char *传递给send函数,而不是将其更新为全局变量,那么同样的方案是否有效? / p>

要演示的一些代码:

#include <pthread.h>

char buf[BUFLEN];

void *updateBuffer(void *arg) {
    while(true) {
        getNewData(buf);
    }
}

void *sendData(void *arg) {
    //Setup socket
    while(true) {
        newfd = accept(sockfd, (struct sockaddr *)&their_addr, &size);
        send(newfd, buf, BUFLEN, 0);
        close(newfd);
    }
}

每当建立新连接时,这将发送更新的值。

我想尝试一下:

#include <pthread.h>

char buf[BUFLEN];

void *updateBuffer(void *arg) {
    while(true) {
        getNewData(buf);
    }
}

void *sendData(void *arg) {
    TCPServer tcpServer;
    while(true) {
        tcpServer.send(buf);
   }
}

函数tcpServer.send(char *)与上面的sendData()基本相同。

这样做的原因是我可以将TCP服务器变成一个类,因为我需要在其他地方使用相同的代码。

从我的理解,因为我传递指针,它基本上与我调用send()时相同,因为我也在那里传递指针。该值将继续更新,但地址不会更改,因此它应该可以工作。如果这是正确的,请告诉我。我也愿意采用新方法(最好没有互斥锁)。

1 个答案:

答案 0 :(得分:0)

是的,这就是我们大多数人发送的方式,将指针传递给缓冲区void *或char *

我会像这样编码:

int sendData(const char * buffer, const int length) 
{
    Socket newfd;
    Int NumOfConnects=0;

    while ((newfd=accept(sockfd, (struct sockaddr *)&their_addr, &size)) > 0)
    {
           // It would be necessary here to lock the buffer with a Mutex
            send(newfd, buffer, length, 0);
           // Release the Mutex
            close(newfd);
            NumOfConnects++;
    }

    // there is an error in the accept
    // this could be OK, 
    // if the main thread has closed the sockfd socket indicating us to quit.

    // returns the number of transfers we have done.
    return NumOfConnects;
}

要考虑使用指向另一个线程中修改的缓冲区的一件事;

可能是在发送过程中缓冲区发生变化且发送的数据不准确。

但是你已经注意到了这种情况。如您所示,建议使用互斥锁。